home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / cpu / z80 / z80.c < prev    next >
C/C++ Source or Header  |  2000-05-20  |  211KB  |  4,593 lines

  1. /*****************************************************************************
  2.  *
  3.  *     z80.c
  4.  *     Portable Z80 emulator V2.8
  5.  *
  6.  *     Copyright (C) 1998,1999,2000 Juergen Buchmueller, all rights reserved.
  7.  *
  8.  *     - This source code is released as freeware for non-commercial purposes.
  9.  *     - You are free to use and redistribute this code in modified or
  10.  *       unmodified form, provided you list me in the credits.
  11.  *     - If you modify this source code, you must add a notice to each modified
  12.  *       source file that it has been changed.  If you're a nice person, you
  13.  *       will clearly mark each change too.  :)
  14.  *     - If you wish to use this for commercial purposes, please contact me at
  15.  *       pullmoll@t-online.de
  16.  *     - The author of this copywritten work reserves the right to change the
  17.  *     terms of its usage and license at any time, including retroactively
  18.  *   - This entire notice must remain in the source code.
  19.  *
  20.  *     Changes in 2.8:
  21.  *     - OUTI/OUTD/OTIR/OTDR also pre-decrement the B register now.
  22.  *       This was wrong because of a bug fix on the wrong side
  23.  *       (astrocade sound driver).
  24.  *   Changes in 2.7:
  25.  *      - removed z80_vm specific code, it's not needed (and never was).
  26.  *   Changes in 2.6:
  27.  *      - BUSY_LOOP_HACKS needed to call change_pc16() earlier, before
  28.  *        checking the opcodes at the new address, because otherwise they
  29.  *        might access the old (wrong or even NULL) banked memory region.
  30.  *        Thanks to Sean Young for finding this nasty bug.
  31.  *   Changes in 2.5:
  32.  *      - Burning cycles always adjusts the ICount by a multiple of 4.
  33.  *      - In REPEAT_AT_ONCE cases the R register wasn't incremented twice
  34.  *        per repetition as it should have been. Those repeated opcodes
  35.  *        could also underflow the ICount.
  36.  *      - Simplified TIME_LOOP_HACKS for BC and added two more for DE + HL
  37.  *        timing loops. I think those hacks weren't endian safe before too.
  38.  *   Changes in 2.4:
  39.  *      - z80_reset zaps the entire context, sets IX and IY to 0xffff(!) and
  40.  *        sets the Z flag. With these changes the Tehkan World Cup driver
  41.  *        _seems_ to work again.
  42.  *   Changes in 2.3:
  43.  *      - External termination of the execution loop calls z80_burn() and
  44.  *        z80_vm_burn() to burn an amount of cycles (R adjustment)
  45.  *      - Shortcuts which burn CPU cycles (BUSY_LOOP_HACKS and TIME_LOOP_HACKS)
  46.  *        now also adjust the R register depending on the skipped opcodes.
  47.  *   Changes in 2.2:
  48.  *      - Fixed bugs in CPL, SCF and CCF instructions flag handling.
  49.  *      - Changed variable EA and ARG16() function to UINT32; this
  50.  *        produces slightly more efficient code.
  51.  *      - The DD/FD XY CB opcodes where XY is 40-7F and Y is not 6/E
  52.  *        are changed to calls to the X6/XE opcodes to reduce object size.
  53.  *        They're hardly ever used so this should not yield a speed penalty.
  54.  *     New in 2.0:
  55.  *    - Optional more exact Z80 emulation (#define Z80_EXACT 1) according
  56.  *        to a detailed description by Sean Young which can be found at:
  57.  *        http://www.msxnet.org/tech/Z80/z80undoc.txt
  58.  *****************************************************************************/
  59.  
  60. #include "driver.h"
  61. #include "cpuintrf.h"
  62. #include "state.h"
  63. #include "mamedbg.h"
  64. #include "z80.h"
  65.  
  66. #define VERBOSE 0
  67.  
  68. #if VERBOSE
  69. #define LOG(x)    logerror x
  70. #else
  71. #define LOG(x)
  72. #endif
  73.  
  74. /* execute main opcodes inside a big switch statement */
  75. #ifndef BIG_SWITCH
  76. #define BIG_SWITCH          1
  77. #endif
  78.  
  79. /* big flags array for ADD/ADC/SUB/SBC/CP results */
  80. #define BIG_FLAGS_ARRAY     1
  81.  
  82. /* Set to 1 for a more exact (but somewhat slower) Z80 emulation */
  83. #define Z80_EXACT            1
  84.  
  85. /* repetitive commands (ldir,cpdr etc.) repeat at
  86.    once until cycles used up or B(C) counted down. */
  87. #define REPEAT_AT_ONCE        1
  88.  
  89. /* on JP and JR opcodes check for tight loops */
  90. #define BUSY_LOOP_HACKS     1
  91.  
  92. /* check for delay loops counting down BC */
  93. #define TIME_LOOP_HACKS     1
  94.  
  95. #ifdef X86_ASM
  96. #undef    BIG_FLAGS_ARRAY
  97. #define BIG_FLAGS_ARRAY     0
  98. #endif
  99.  
  100. static UINT8 z80_reg_layout[] = {
  101.     Z80_PC, Z80_SP, Z80_AF, Z80_BC, Z80_DE, Z80_HL, -1,
  102.     Z80_IX, Z80_IY, Z80_AF2,Z80_BC2,Z80_DE2,Z80_HL2,-1,
  103.     Z80_R,  Z80_I,  Z80_IM, Z80_IFF1,Z80_IFF2, -1,
  104.     Z80_NMI_STATE,Z80_IRQ_STATE,Z80_DC0,Z80_DC1,Z80_DC2,Z80_DC3, 0
  105. };
  106.  
  107. static UINT8 z80_win_layout[] = {
  108.     27, 0,53, 4,    /* register window (top rows) */
  109.      0, 0,26,22,    /* disassembler window (left colums) */
  110.     27, 5,53, 8,    /* memory #1 window (right, upper middle) */
  111.     27,14,53, 8,    /* memory #2 window (right, lower middle) */
  112.      0,23,80, 1,    /* command line window (bottom rows) */
  113. };
  114.  
  115. /****************************************************************************/
  116. /* The Z80 registers. HALT is set to 1 when the CPU is halted, the refresh  */
  117. /* register is calculated as follows: refresh=(Regs.R&127)|(Regs.R2&128)    */
  118. /****************************************************************************/
  119. typedef struct {
  120. /* 00 */    PAIR    PREPC,PC,SP,AF,BC,DE,HL,IX,IY;
  121. /* 24 */    PAIR    AF2,BC2,DE2,HL2;
  122. /* 34 */    UINT8   R,R2,IFF1,IFF2,HALT,IM,I;
  123. /* 3B */    UINT8   irq_max;            /* number of daisy chain devices        */
  124. /* 3C */    INT8    request_irq;        /* daisy chain next request device        */
  125. /* 3D */    INT8    service_irq;        /* daisy chain next reti handling device */
  126. /* 3E */    UINT8    nmi_state;            /* nmi line state */
  127. /* 3F */    UINT8    irq_state;            /* irq line state */
  128. /* 40 */    UINT8   int_state[Z80_MAXDAISY];
  129. /* 44 */    Z80_DaisyChain irq[Z80_MAXDAISY];
  130. /* 84 */    int     (*irq_callback)(int irqline);
  131. /* 88 */    int     extra_cycles;       /* extra cycles for interrupts */
  132. }   Z80_Regs;
  133.  
  134. #define CF  0x01
  135. #define NF    0x02
  136. #define PF    0x04
  137. #define VF    PF
  138. #define XF    0x08
  139. #define HF    0x10
  140. #define YF    0x20
  141. #define ZF    0x40
  142. #define SF    0x80
  143.  
  144. #define INT_IRQ 0x01
  145. #define NMI_IRQ 0x02
  146.  
  147. #define    _PPC    Z80.PREPC.d        /* previous program counter */
  148.  
  149. #define _PCD    Z80.PC.d
  150. #define _PC     Z80.PC.w.l
  151.  
  152. #define _SPD    Z80.SP.d
  153. #define _SP     Z80.SP.w.l
  154.  
  155. #define _AFD    Z80.AF.d
  156. #define _AF     Z80.AF.w.l
  157. #define _A        Z80.AF.b.h
  158. #define _F        Z80.AF.b.l
  159.  
  160. #define _BCD    Z80.BC.d
  161. #define _BC     Z80.BC.w.l
  162. #define _B        Z80.BC.b.h
  163. #define _C        Z80.BC.b.l
  164.  
  165. #define _DED    Z80.DE.d
  166. #define _DE     Z80.DE.w.l
  167. #define _D        Z80.DE.b.h
  168. #define _E        Z80.DE.b.l
  169.  
  170. #define _HLD    Z80.HL.d
  171. #define _HL     Z80.HL.w.l
  172. #define _H        Z80.HL.b.h
  173. #define _L        Z80.HL.b.l
  174.  
  175. #define _IXD    Z80.IX.d
  176. #define _IX     Z80.IX.w.l
  177. #define _HX     Z80.IX.b.h
  178. #define _LX     Z80.IX.b.l
  179.  
  180. #define _IYD    Z80.IY.d
  181. #define _IY     Z80.IY.w.l
  182. #define _HY     Z80.IY.b.h
  183. #define _LY     Z80.IY.b.l
  184.  
  185. #define _I      Z80.I
  186. #define _R      Z80.R
  187. #define _R2     Z80.R2
  188. #define _IM     Z80.IM
  189. #define _IFF1    Z80.IFF1
  190. #define _IFF2    Z80.IFF2
  191. #define _HALT    Z80.HALT
  192.  
  193. int z80_ICount;
  194. static Z80_Regs Z80;
  195. static UINT32 EA;
  196. static int after_EI = 0;
  197.  
  198. static UINT8 SZ[256];        /* zero and sign flags */
  199. static UINT8 SZ_BIT[256];    /* zero, sign and parity/overflow (=zero) flags for BIT opcode */
  200. static UINT8 SZP[256];        /* zero, sign and parity flags */
  201. static UINT8 SZHV_inc[256]; /* zero, sign, half carry and overflow flags INC r8 */
  202. static UINT8 SZHV_dec[256]; /* zero, sign, half carry and overflow flags DEC r8 */
  203. #include "z80daa.h"
  204. #if BIG_FLAGS_ARRAY
  205. #include <signal.h>
  206. static UINT8 *SZHVC_add = 0;
  207. static UINT8 *SZHVC_sub = 0;
  208. #endif
  209.  
  210. #if Z80_EXACT
  211. /* tmp1 value for ini/inir/outi/otir for [C.1-0][io.1-0] */
  212. static UINT8 irep_tmp1[4][4] = {
  213.     {0,0,1,0},{0,1,0,1},{1,0,1,1},{0,1,1,0}
  214. };
  215.  
  216. /* tmp1 value for ind/indr/outd/otdr for [C.1-0][io.1-0] */
  217. static UINT8 drep_tmp1[4][4] = {
  218.     {0,1,0,0},{1,0,0,1},{0,0,1,0},{0,1,0,1}
  219. };
  220.  
  221. /* tmp2 value for all in/out repeated opcodes for B.7-0 */
  222. static UINT8 breg_tmp2[256] = {
  223.     0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,
  224.     0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,
  225.     1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,
  226.     1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,
  227.     0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,
  228.     1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,
  229.     0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,
  230.     0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,
  231.     1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,
  232.     1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,
  233.     0,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,
  234.     0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,
  235.     1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,
  236.     0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,
  237.     1,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,
  238.     1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1
  239. };
  240. #endif
  241.  
  242. static UINT8 cc_op[0x100] = {
  243.  4,10, 7, 6, 4, 4, 7, 4, 4,11, 7, 6, 4, 4, 7, 4,
  244.  8,10, 7, 6, 4, 4, 7, 4,12,11, 7, 6, 4, 4, 7, 4,
  245.  7,10,16, 6, 4, 4, 7, 4, 7,11,16, 6, 4, 4, 7, 4,
  246.  7,10,13, 6,11,11,10, 4, 7,11,13, 6, 4, 4, 7, 4,
  247.  4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
  248.  4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
  249.  4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
  250.  7, 7, 7, 7, 7, 7, 4, 7, 4, 4, 4, 4, 4, 4, 7, 4,
  251.  4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
  252.  4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
  253.  4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
  254.  4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
  255.  5,10,10,10,10,11, 7,11, 5, 4,10, 0,10,10, 7,11,
  256.  5,10,10,11,10,11, 7,11, 5, 4,10,11,10, 0, 7,11,
  257.  5,10,10,19,10,11, 7,11, 5, 4,10, 4,10, 0, 7,11,
  258.  5,10,10, 4,10,11, 7,11, 5, 6,10, 4,10, 0, 7,11};
  259.  
  260.  
  261. static UINT8 cc_cb[0x100] = {
  262.  8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
  263.  8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
  264.  8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
  265.  8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
  266.  8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
  267.  8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
  268.  8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
  269.  8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
  270.  8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
  271.  8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
  272.  8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
  273.  8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
  274.  8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
  275.  8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
  276.  8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
  277.  8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8};
  278.  
  279. static UINT8 cc_dd[0x100] = {
  280.  4, 4, 4, 4, 4, 4, 4, 4, 4,15, 4, 4, 4, 4, 4, 4,
  281.  4, 4, 4, 4, 4, 4, 4, 4, 4,15, 4, 4, 4, 4, 4, 4,
  282.  4,14,20,10, 9, 9, 9, 4, 4,15,20,10, 9, 9, 9, 4,
  283.  4, 4, 4, 4,23,23,19, 4, 4,15, 4, 4, 4, 4, 4, 4,
  284.  4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4,
  285.  4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4,
  286.  9, 9, 9, 9, 9, 9,19, 9, 9, 9, 9, 9, 9, 9,19, 9,
  287. 19,19,19,19,19,19, 4,19, 4, 4, 4, 4, 9, 9,19, 4,
  288.  4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4,
  289.  4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4,
  290.  4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4,
  291.  4, 4, 4, 4, 9, 9,19, 4, 4, 4, 4, 4, 9, 9,19, 4,
  292.  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4,
  293.  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  294.  4,14, 4,23, 4,15, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4,
  295.  4, 4, 4, 4, 4, 4, 4, 4, 4,10, 4, 4, 4, 4, 4, 4};
  296.  
  297. // dd/fd cycles are identical
  298. #define cc_fd cc_dd
  299.  
  300. static UINT8 cc_xxcb[0x100] = {
  301. 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
  302. 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
  303. 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
  304. 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
  305. 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,
  306. 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,
  307. 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,
  308. 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,
  309. 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
  310. 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
  311. 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
  312. 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
  313. 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
  314. 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
  315. 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,
  316. 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23};
  317.  
  318. static UINT8 cc_ed[0x100] = {
  319.  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  320.  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  321.  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  322.  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  323. 12,12,15,20, 8, 8, 8, 9,12,12,15,20, 8, 8, 8, 9,
  324. 12,12,15,20, 8, 8, 8, 9,12,12,15,20, 8, 8, 8, 9,
  325. 12,12,15,20, 8, 8, 8,18,12,12,15,20, 8, 8, 8,18,
  326. 12,12,15,20, 8, 8, 8, 8,12,12,15,20, 8, 8, 8, 8,
  327.  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  328.  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  329. 16,16,16,16, 8, 8, 8, 8,16,16,16,16, 8, 8, 8, 8,
  330. 16,16,16,16, 8, 8, 8, 8,16,16,16,16, 8, 8, 8, 8,
  331.  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  332.  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  333.  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
  334.  8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8};
  335.  
  336. static void take_interrupt(void);
  337.  
  338. #define PROTOTYPES(tablename,prefix) \
  339.     INLINE void prefix##_00(void); INLINE void prefix##_01(void); INLINE void prefix##_02(void); INLINE void prefix##_03(void); \
  340.     INLINE void prefix##_04(void); INLINE void prefix##_05(void); INLINE void prefix##_06(void); INLINE void prefix##_07(void); \
  341.     INLINE void prefix##_08(void); INLINE void prefix##_09(void); INLINE void prefix##_0a(void); INLINE void prefix##_0b(void); \
  342.     INLINE void prefix##_0c(void); INLINE void prefix##_0d(void); INLINE void prefix##_0e(void); INLINE void prefix##_0f(void); \
  343.     INLINE void prefix##_10(void); INLINE void prefix##_11(void); INLINE void prefix##_12(void); INLINE void prefix##_13(void); \
  344.     INLINE void prefix##_14(void); INLINE void prefix##_15(void); INLINE void prefix##_16(void); INLINE void prefix##_17(void); \
  345.     INLINE void prefix##_18(void); INLINE void prefix##_19(void); INLINE void prefix##_1a(void); INLINE void prefix##_1b(void); \
  346.     INLINE void prefix##_1c(void); INLINE void prefix##_1d(void); INLINE void prefix##_1e(void); INLINE void prefix##_1f(void); \
  347.     INLINE void prefix##_20(void); INLINE void prefix##_21(void); INLINE void prefix##_22(void); INLINE void prefix##_23(void); \
  348.     INLINE void prefix##_24(void); INLINE void prefix##_25(void); INLINE void prefix##_26(void); INLINE void prefix##_27(void); \
  349.     INLINE void prefix##_28(void); INLINE void prefix##_29(void); INLINE void prefix##_2a(void); INLINE void prefix##_2b(void); \
  350.     INLINE void prefix##_2c(void); INLINE void prefix##_2d(void); INLINE void prefix##_2e(void); INLINE void prefix##_2f(void); \
  351.     INLINE void prefix##_30(void); INLINE void prefix##_31(void); INLINE void prefix##_32(void); INLINE void prefix##_33(void); \
  352.     INLINE void prefix##_34(void); INLINE void prefix##_35(void); INLINE void prefix##_36(void); INLINE void prefix##_37(void); \
  353.     INLINE void prefix##_38(void); INLINE void prefix##_39(void); INLINE void prefix##_3a(void); INLINE void prefix##_3b(void); \
  354.     INLINE void prefix##_3c(void); INLINE void prefix##_3d(void); INLINE void prefix##_3e(void); INLINE void prefix##_3f(void); \
  355.     INLINE void prefix##_40(void); INLINE void prefix##_41(void); INLINE void prefix##_42(void); INLINE void prefix##_43(void); \
  356.     INLINE void prefix##_44(void); INLINE void prefix##_45(void); INLINE void prefix##_46(void); INLINE void prefix##_47(void); \
  357.     INLINE void prefix##_48(void); INLINE void prefix##_49(void); INLINE void prefix##_4a(void); INLINE void prefix##_4b(void); \
  358.     INLINE void prefix##_4c(void); INLINE void prefix##_4d(void); INLINE void prefix##_4e(void); INLINE void prefix##_4f(void); \
  359.     INLINE void prefix##_50(void); INLINE void prefix##_51(void); INLINE void prefix##_52(void); INLINE void prefix##_53(void); \
  360.     INLINE void prefix##_54(void); INLINE void prefix##_55(void); INLINE void prefix##_56(void); INLINE void prefix##_57(void); \
  361.     INLINE void prefix##_58(void); INLINE void prefix##_59(void); INLINE void prefix##_5a(void); INLINE void prefix##_5b(void); \
  362.     INLINE void prefix##_5c(void); INLINE void prefix##_5d(void); INLINE void prefix##_5e(void); INLINE void prefix##_5f(void); \
  363.     INLINE void prefix##_60(void); INLINE void prefix##_61(void); INLINE void prefix##_62(void); INLINE void prefix##_63(void); \
  364.     INLINE void prefix##_64(void); INLINE void prefix##_65(void); INLINE void prefix##_66(void); INLINE void prefix##_67(void); \
  365.     INLINE void prefix##_68(void); INLINE void prefix##_69(void); INLINE void prefix##_6a(void); INLINE void prefix##_6b(void); \
  366.     INLINE void prefix##_6c(void); INLINE void prefix##_6d(void); INLINE void prefix##_6e(void); INLINE void prefix##_6f(void); \
  367.     INLINE void prefix##_70(void); INLINE void prefix##_71(void); INLINE void prefix##_72(void); INLINE void prefix##_73(void); \
  368.     INLINE void prefix##_74(void); INLINE void prefix##_75(void); INLINE void prefix##_76(void); INLINE void prefix##_77(void); \
  369.     INLINE void prefix##_78(void); INLINE void prefix##_79(void); INLINE void prefix##_7a(void); INLINE void prefix##_7b(void); \
  370.     INLINE void prefix##_7c(void); INLINE void prefix##_7d(void); INLINE void prefix##_7e(void); INLINE void prefix##_7f(void); \
  371.     INLINE void prefix##_80(void); INLINE void prefix##_81(void); INLINE void prefix##_82(void); INLINE void prefix##_83(void); \
  372.     INLINE void prefix##_84(void); INLINE void prefix##_85(void); INLINE void prefix##_86(void); INLINE void prefix##_87(void); \
  373.     INLINE void prefix##_88(void); INLINE void prefix##_89(void); INLINE void prefix##_8a(void); INLINE void prefix##_8b(void); \
  374.     INLINE void prefix##_8c(void); INLINE void prefix##_8d(void); INLINE void prefix##_8e(void); INLINE void prefix##_8f(void); \
  375.     INLINE void prefix##_90(void); INLINE void prefix##_91(void); INLINE void prefix##_92(void); INLINE void prefix##_93(void); \
  376.     INLINE void prefix##_94(void); INLINE void prefix##_95(void); INLINE void prefix##_96(void); INLINE void prefix##_97(void); \
  377.     INLINE void prefix##_98(void); INLINE void prefix##_99(void); INLINE void prefix##_9a(void); INLINE void prefix##_9b(void); \
  378.     INLINE void prefix##_9c(void); INLINE void prefix##_9d(void); INLINE void prefix##_9e(void); INLINE void prefix##_9f(void); \
  379.     INLINE void prefix##_a0(void); INLINE void prefix##_a1(void); INLINE void prefix##_a2(void); INLINE void prefix##_a3(void); \
  380.     INLINE void prefix##_a4(void); INLINE void prefix##_a5(void); INLINE void prefix##_a6(void); INLINE void prefix##_a7(void); \
  381.     INLINE void prefix##_a8(void); INLINE void prefix##_a9(void); INLINE void prefix##_aa(void); INLINE void prefix##_ab(void); \
  382.     INLINE void prefix##_ac(void); INLINE void prefix##_ad(void); INLINE void prefix##_ae(void); INLINE void prefix##_af(void); \
  383.     INLINE void prefix##_b0(void); INLINE void prefix##_b1(void); INLINE void prefix##_b2(void); INLINE void prefix##_b3(void); \
  384.     INLINE void prefix##_b4(void); INLINE void prefix##_b5(void); INLINE void prefix##_b6(void); INLINE void prefix##_b7(void); \
  385.     INLINE void prefix##_b8(void); INLINE void prefix##_b9(void); INLINE void prefix##_ba(void); INLINE void prefix##_bb(void); \
  386.     INLINE void prefix##_bc(void); INLINE void prefix##_bd(void); INLINE void prefix##_be(void); INLINE void prefix##_bf(void); \
  387.     INLINE void prefix##_c0(void); INLINE void prefix##_c1(void); INLINE void prefix##_c2(void); INLINE void prefix##_c3(void); \
  388.     INLINE void prefix##_c4(void); INLINE void prefix##_c5(void); INLINE void prefix##_c6(void); INLINE void prefix##_c7(void); \
  389.     INLINE void prefix##_c8(void); INLINE void prefix##_c9(void); INLINE void prefix##_ca(void); INLINE void prefix##_cb(void); \
  390.     INLINE void prefix##_cc(void); INLINE void prefix##_cd(void); INLINE void prefix##_ce(void); INLINE void prefix##_cf(void); \
  391.     INLINE void prefix##_d0(void); INLINE void prefix##_d1(void); INLINE void prefix##_d2(void); INLINE void prefix##_d3(void); \
  392.     INLINE void prefix##_d4(void); INLINE void prefix##_d5(void); INLINE void prefix##_d6(void); INLINE void prefix##_d7(void); \
  393.     INLINE void prefix##_d8(void); INLINE void prefix##_d9(void); INLINE void prefix##_da(void); INLINE void prefix##_db(void); \
  394.     INLINE void prefix##_dc(void); INLINE void prefix##_dd(void); INLINE void prefix##_de(void); INLINE void prefix##_df(void); \
  395.     INLINE void prefix##_e0(void); INLINE void prefix##_e1(void); INLINE void prefix##_e2(void); INLINE void prefix##_e3(void); \
  396.     INLINE void prefix##_e4(void); INLINE void prefix##_e5(void); INLINE void prefix##_e6(void); INLINE void prefix##_e7(void); \
  397.     INLINE void prefix##_e8(void); INLINE void prefix##_e9(void); INLINE void prefix##_ea(void); INLINE void prefix##_eb(void); \
  398.     INLINE void prefix##_ec(void); INLINE void prefix##_ed(void); INLINE void prefix##_ee(void); INLINE void prefix##_ef(void); \
  399.     INLINE void prefix##_f0(void); INLINE void prefix##_f1(void); INLINE void prefix##_f2(void); INLINE void prefix##_f3(void); \
  400.     INLINE void prefix##_f4(void); INLINE void prefix##_f5(void); INLINE void prefix##_f6(void); INLINE void prefix##_f7(void); \
  401.     INLINE void prefix##_f8(void); INLINE void prefix##_f9(void); INLINE void prefix##_fa(void); INLINE void prefix##_fb(void); \
  402.     INLINE void prefix##_fc(void); INLINE void prefix##_fd(void); INLINE void prefix##_fe(void); INLINE void prefix##_ff(void); \
  403. static void (*tablename[0x100])(void) = {    \
  404.     prefix##_00,prefix##_01,prefix##_02,prefix##_03,prefix##_04,prefix##_05,prefix##_06,prefix##_07, \
  405.     prefix##_08,prefix##_09,prefix##_0a,prefix##_0b,prefix##_0c,prefix##_0d,prefix##_0e,prefix##_0f, \
  406.     prefix##_10,prefix##_11,prefix##_12,prefix##_13,prefix##_14,prefix##_15,prefix##_16,prefix##_17, \
  407.     prefix##_18,prefix##_19,prefix##_1a,prefix##_1b,prefix##_1c,prefix##_1d,prefix##_1e,prefix##_1f, \
  408.     prefix##_20,prefix##_21,prefix##_22,prefix##_23,prefix##_24,prefix##_25,prefix##_26,prefix##_27, \
  409.     prefix##_28,prefix##_29,prefix##_2a,prefix##_2b,prefix##_2c,prefix##_2d,prefix##_2e,prefix##_2f, \
  410.     prefix##_30,prefix##_31,prefix##_32,prefix##_33,prefix##_34,prefix##_35,prefix##_36,prefix##_37, \
  411.     prefix##_38,prefix##_39,prefix##_3a,prefix##_3b,prefix##_3c,prefix##_3d,prefix##_3e,prefix##_3f, \
  412.     prefix##_40,prefix##_41,prefix##_42,prefix##_43,prefix##_44,prefix##_45,prefix##_46,prefix##_47, \
  413.     prefix##_48,prefix##_49,prefix##_4a,prefix##_4b,prefix##_4c,prefix##_4d,prefix##_4e,prefix##_4f, \
  414.     prefix##_50,prefix##_51,prefix##_52,prefix##_53,prefix##_54,prefix##_55,prefix##_56,prefix##_57, \
  415.     prefix##_58,prefix##_59,prefix##_5a,prefix##_5b,prefix##_5c,prefix##_5d,prefix##_5e,prefix##_5f, \
  416.     prefix##_60,prefix##_61,prefix##_62,prefix##_63,prefix##_64,prefix##_65,prefix##_66,prefix##_67, \
  417.     prefix##_68,prefix##_69,prefix##_6a,prefix##_6b,prefix##_6c,prefix##_6d,prefix##_6e,prefix##_6f, \
  418.     prefix##_70,prefix##_71,prefix##_72,prefix##_73,prefix##_74,prefix##_75,prefix##_76,prefix##_77, \
  419.     prefix##_78,prefix##_79,prefix##_7a,prefix##_7b,prefix##_7c,prefix##_7d,prefix##_7e,prefix##_7f, \
  420.     prefix##_80,prefix##_81,prefix##_82,prefix##_83,prefix##_84,prefix##_85,prefix##_86,prefix##_87, \
  421.     prefix##_88,prefix##_89,prefix##_8a,prefix##_8b,prefix##_8c,prefix##_8d,prefix##_8e,prefix##_8f, \
  422.     prefix##_90,prefix##_91,prefix##_92,prefix##_93,prefix##_94,prefix##_95,prefix##_96,prefix##_97, \
  423.     prefix##_98,prefix##_99,prefix##_9a,prefix##_9b,prefix##_9c,prefix##_9d,prefix##_9e,prefix##_9f, \
  424.     prefix##_a0,prefix##_a1,prefix##_a2,prefix##_a3,prefix##_a4,prefix##_a5,prefix##_a6,prefix##_a7, \
  425.     prefix##_a8,prefix##_a9,prefix##_aa,prefix##_ab,prefix##_ac,prefix##_ad,prefix##_ae,prefix##_af, \
  426.     prefix##_b0,prefix##_b1,prefix##_b2,prefix##_b3,prefix##_b4,prefix##_b5,prefix##_b6,prefix##_b7, \
  427.     prefix##_b8,prefix##_b9,prefix##_ba,prefix##_bb,prefix##_bc,prefix##_bd,prefix##_be,prefix##_bf, \
  428.     prefix##_c0,prefix##_c1,prefix##_c2,prefix##_c3,prefix##_c4,prefix##_c5,prefix##_c6,prefix##_c7, \
  429.     prefix##_c8,prefix##_c9,prefix##_ca,prefix##_cb,prefix##_cc,prefix##_cd,prefix##_ce,prefix##_cf, \
  430.     prefix##_d0,prefix##_d1,prefix##_d2,prefix##_d3,prefix##_d4,prefix##_d5,prefix##_d6,prefix##_d7, \
  431.     prefix##_d8,prefix##_d9,prefix##_da,prefix##_db,prefix##_dc,prefix##_dd,prefix##_de,prefix##_df, \
  432.     prefix##_e0,prefix##_e1,prefix##_e2,prefix##_e3,prefix##_e4,prefix##_e5,prefix##_e6,prefix##_e7, \
  433.     prefix##_e8,prefix##_e9,prefix##_ea,prefix##_eb,prefix##_ec,prefix##_ed,prefix##_ee,prefix##_ef, \
  434.     prefix##_f0,prefix##_f1,prefix##_f2,prefix##_f3,prefix##_f4,prefix##_f5,prefix##_f6,prefix##_f7, \
  435.     prefix##_f8,prefix##_f9,prefix##_fa,prefix##_fb,prefix##_fc,prefix##_fd,prefix##_fe,prefix##_ff  \
  436. }
  437.  
  438. PROTOTYPES(Z80op,op);
  439. PROTOTYPES(Z80cb,cb);
  440. PROTOTYPES(Z80dd,dd);
  441. PROTOTYPES(Z80ed,ed);
  442. PROTOTYPES(Z80fd,fd);
  443. PROTOTYPES(Z80xxcb,xxcb);
  444.  
  445. /****************************************************************************/
  446. /* Burn an odd amount of cycles, that is instructions taking something      */
  447. /* different from 4 T-states per opcode (and R increment)                   */
  448. /****************************************************************************/
  449. INLINE void BURNODD(int cycles, int opcodes, int cyclesum)
  450. {
  451.     if( cycles > 0 )
  452.     {
  453.         _R += (cycles / cyclesum) * opcodes;
  454.         z80_ICount -= (cycles / cyclesum) * cyclesum;
  455.     }
  456. }
  457.  
  458. /***************************************************************
  459.  * define an opcode function
  460.  ***************************************************************/
  461. #define OP(prefix,opcode)  INLINE void prefix##_##opcode(void)
  462.  
  463. /***************************************************************
  464.  * adjust cycle count by n T-states
  465.  ***************************************************************/
  466. #define CY(cycles) z80_ICount -= cycles
  467.  
  468. /***************************************************************
  469.  * execute an opcode
  470.  ***************************************************************/
  471. #define EXEC(prefix,opcode)                                     \
  472. {                                                                \
  473.     unsigned op = opcode;                                        \
  474.     CY(cc_##prefix[op]);                                        \
  475.     (*Z80##prefix[op])();                                        \
  476. }
  477.  
  478. #if BIG_SWITCH
  479. #define EXEC_INLINE(prefix,opcode)                                \
  480. {                                                                \
  481.     unsigned op = opcode;                                        \
  482.     CY(cc_##prefix[op]);                                        \
  483.     switch(op)                                                    \
  484.     {                                                            \
  485.     case 0x00:prefix##_##00();break; case 0x01:prefix##_##01();break; case 0x02:prefix##_##02();break; case 0x03:prefix##_##03();break; \
  486.     case 0x04:prefix##_##04();break; case 0x05:prefix##_##05();break; case 0x06:prefix##_##06();break; case 0x07:prefix##_##07();break; \
  487.     case 0x08:prefix##_##08();break; case 0x09:prefix##_##09();break; case 0x0a:prefix##_##0a();break; case 0x0b:prefix##_##0b();break; \
  488.     case 0x0c:prefix##_##0c();break; case 0x0d:prefix##_##0d();break; case 0x0e:prefix##_##0e();break; case 0x0f:prefix##_##0f();break; \
  489.     case 0x10:prefix##_##10();break; case 0x11:prefix##_##11();break; case 0x12:prefix##_##12();break; case 0x13:prefix##_##13();break; \
  490.     case 0x14:prefix##_##14();break; case 0x15:prefix##_##15();break; case 0x16:prefix##_##16();break; case 0x17:prefix##_##17();break; \
  491.     case 0x18:prefix##_##18();break; case 0x19:prefix##_##19();break; case 0x1a:prefix##_##1a();break; case 0x1b:prefix##_##1b();break; \
  492.     case 0x1c:prefix##_##1c();break; case 0x1d:prefix##_##1d();break; case 0x1e:prefix##_##1e();break; case 0x1f:prefix##_##1f();break; \
  493.     case 0x20:prefix##_##20();break; case 0x21:prefix##_##21();break; case 0x22:prefix##_##22();break; case 0x23:prefix##_##23();break; \
  494.     case 0x24:prefix##_##24();break; case 0x25:prefix##_##25();break; case 0x26:prefix##_##26();break; case 0x27:prefix##_##27();break; \
  495.     case 0x28:prefix##_##28();break; case 0x29:prefix##_##29();break; case 0x2a:prefix##_##2a();break; case 0x2b:prefix##_##2b();break; \
  496.     case 0x2c:prefix##_##2c();break; case 0x2d:prefix##_##2d();break; case 0x2e:prefix##_##2e();break; case 0x2f:prefix##_##2f();break; \
  497.     case 0x30:prefix##_##30();break; case 0x31:prefix##_##31();break; case 0x32:prefix##_##32();break; case 0x33:prefix##_##33();break; \
  498.     case 0x34:prefix##_##34();break; case 0x35:prefix##_##35();break; case 0x36:prefix##_##36();break; case 0x37:prefix##_##37();break; \
  499.     case 0x38:prefix##_##38();break; case 0x39:prefix##_##39();break; case 0x3a:prefix##_##3a();break; case 0x3b:prefix##_##3b();break; \
  500.     case 0x3c:prefix##_##3c();break; case 0x3d:prefix##_##3d();break; case 0x3e:prefix##_##3e();break; case 0x3f:prefix##_##3f();break; \
  501.     case 0x40:prefix##_##40();break; case 0x41:prefix##_##41();break; case 0x42:prefix##_##42();break; case 0x43:prefix##_##43();break; \
  502.     case 0x44:prefix##_##44();break; case 0x45:prefix##_##45();break; case 0x46:prefix##_##46();break; case 0x47:prefix##_##47();break; \
  503.     case 0x48:prefix##_##48();break; case 0x49:prefix##_##49();break; case 0x4a:prefix##_##4a();break; case 0x4b:prefix##_##4b();break; \
  504.     case 0x4c:prefix##_##4c();break; case 0x4d:prefix##_##4d();break; case 0x4e:prefix##_##4e();break; case 0x4f:prefix##_##4f();break; \
  505.     case 0x50:prefix##_##50();break; case 0x51:prefix##_##51();break; case 0x52:prefix##_##52();break; case 0x53:prefix##_##53();break; \
  506.     case 0x54:prefix##_##54();break; case 0x55:prefix##_##55();break; case 0x56:prefix##_##56();break; case 0x57:prefix##_##57();break; \
  507.     case 0x58:prefix##_##58();break; case 0x59:prefix##_##59();break; case 0x5a:prefix##_##5a();break; case 0x5b:prefix##_##5b();break; \
  508.     case 0x5c:prefix##_##5c();break; case 0x5d:prefix##_##5d();break; case 0x5e:prefix##_##5e();break; case 0x5f:prefix##_##5f();break; \
  509.     case 0x60:prefix##_##60();break; case 0x61:prefix##_##61();break; case 0x62:prefix##_##62();break; case 0x63:prefix##_##63();break; \
  510.     case 0x64:prefix##_##64();break; case 0x65:prefix##_##65();break; case 0x66:prefix##_##66();break; case 0x67:prefix##_##67();break; \
  511.     case 0x68:prefix##_##68();break; case 0x69:prefix##_##69();break; case 0x6a:prefix##_##6a();break; case 0x6b:prefix##_##6b();break; \
  512.     case 0x6c:prefix##_##6c();break; case 0x6d:prefix##_##6d();break; case 0x6e:prefix##_##6e();break; case 0x6f:prefix##_##6f();break; \
  513.     case 0x70:prefix##_##70();break; case 0x71:prefix##_##71();break; case 0x72:prefix##_##72();break; case 0x73:prefix##_##73();break; \
  514.     case 0x74:prefix##_##74();break; case 0x75:prefix##_##75();break; case 0x76:prefix##_##76();break; case 0x77:prefix##_##77();break; \
  515.     case 0x78:prefix##_##78();break; case 0x79:prefix##_##79();break; case 0x7a:prefix##_##7a();break; case 0x7b:prefix##_##7b();break; \
  516.     case 0x7c:prefix##_##7c();break; case 0x7d:prefix##_##7d();break; case 0x7e:prefix##_##7e();break; case 0x7f:prefix##_##7f();break; \
  517.     case 0x80:prefix##_##80();break; case 0x81:prefix##_##81();break; case 0x82:prefix##_##82();break; case 0x83:prefix##_##83();break; \
  518.     case 0x84:prefix##_##84();break; case 0x85:prefix##_##85();break; case 0x86:prefix##_##86();break; case 0x87:prefix##_##87();break; \
  519.     case 0x88:prefix##_##88();break; case 0x89:prefix##_##89();break; case 0x8a:prefix##_##8a();break; case 0x8b:prefix##_##8b();break; \
  520.     case 0x8c:prefix##_##8c();break; case 0x8d:prefix##_##8d();break; case 0x8e:prefix##_##8e();break; case 0x8f:prefix##_##8f();break; \
  521.     case 0x90:prefix##_##90();break; case 0x91:prefix##_##91();break; case 0x92:prefix##_##92();break; case 0x93:prefix##_##93();break; \
  522.     case 0x94:prefix##_##94();break; case 0x95:prefix##_##95();break; case 0x96:prefix##_##96();break; case 0x97:prefix##_##97();break; \
  523.     case 0x98:prefix##_##98();break; case 0x99:prefix##_##99();break; case 0x9a:prefix##_##9a();break; case 0x9b:prefix##_##9b();break; \
  524.     case 0x9c:prefix##_##9c();break; case 0x9d:prefix##_##9d();break; case 0x9e:prefix##_##9e();break; case 0x9f:prefix##_##9f();break; \
  525.     case 0xa0:prefix##_##a0();break; case 0xa1:prefix##_##a1();break; case 0xa2:prefix##_##a2();break; case 0xa3:prefix##_##a3();break; \
  526.     case 0xa4:prefix##_##a4();break; case 0xa5:prefix##_##a5();break; case 0xa6:prefix##_##a6();break; case 0xa7:prefix##_##a7();break; \
  527.     case 0xa8:prefix##_##a8();break; case 0xa9:prefix##_##a9();break; case 0xaa:prefix##_##aa();break; case 0xab:prefix##_##ab();break; \
  528.     case 0xac:prefix##_##ac();break; case 0xad:prefix##_##ad();break; case 0xae:prefix##_##ae();break; case 0xaf:prefix##_##af();break; \
  529.     case 0xb0:prefix##_##b0();break; case 0xb1:prefix##_##b1();break; case 0xb2:prefix##_##b2();break; case 0xb3:prefix##_##b3();break; \
  530.     case 0xb4:prefix##_##b4();break; case 0xb5:prefix##_##b5();break; case 0xb6:prefix##_##b6();break; case 0xb7:prefix##_##b7();break; \
  531.     case 0xb8:prefix##_##b8();break; case 0xb9:prefix##_##b9();break; case 0xba:prefix##_##ba();break; case 0xbb:prefix##_##bb();break; \
  532.     case 0xbc:prefix##_##bc();break; case 0xbd:prefix##_##bd();break; case 0xbe:prefix##_##be();break; case 0xbf:prefix##_##bf();break; \
  533.     case 0xc0:prefix##_##c0();break; case 0xc1:prefix##_##c1();break; case 0xc2:prefix##_##c2();break; case 0xc3:prefix##_##c3();break; \
  534.     case 0xc4:prefix##_##c4();break; case 0xc5:prefix##_##c5();break; case 0xc6:prefix##_##c6();break; case 0xc7:prefix##_##c7();break; \
  535.     case 0xc8:prefix##_##c8();break; case 0xc9:prefix##_##c9();break; case 0xca:prefix##_##ca();break; case 0xcb:prefix##_##cb();break; \
  536.     case 0xcc:prefix##_##cc();break; case 0xcd:prefix##_##cd();break; case 0xce:prefix##_##ce();break; case 0xcf:prefix##_##cf();break; \
  537.     case 0xd0:prefix##_##d0();break; case 0xd1:prefix##_##d1();break; case 0xd2:prefix##_##d2();break; case 0xd3:prefix##_##d3();break; \
  538.     case 0xd4:prefix##_##d4();break; case 0xd5:prefix##_##d5();break; case 0xd6:prefix##_##d6();break; case 0xd7:prefix##_##d7();break; \
  539.     case 0xd8:prefix##_##d8();break; case 0xd9:prefix##_##d9();break; case 0xda:prefix##_##da();break; case 0xdb:prefix##_##db();break; \
  540.     case 0xdc:prefix##_##dc();break; case 0xdd:prefix##_##dd();break; case 0xde:prefix##_##de();break; case 0xdf:prefix##_##df();break; \
  541.     case 0xe0:prefix##_##e0();break; case 0xe1:prefix##_##e1();break; case 0xe2:prefix##_##e2();break; case 0xe3:prefix##_##e3();break; \
  542.     case 0xe4:prefix##_##e4();break; case 0xe5:prefix##_##e5();break; case 0xe6:prefix##_##e6();break; case 0xe7:prefix##_##e7();break; \
  543.     case 0xe8:prefix##_##e8();break; case 0xe9:prefix##_##e9();break; case 0xea:prefix##_##ea();break; case 0xeb:prefix##_##eb();break; \
  544.     case 0xec:prefix##_##ec();break; case 0xed:prefix##_##ed();break; case 0xee:prefix##_##ee();break; case 0xef:prefix##_##ef();break; \
  545.     case 0xf0:prefix##_##f0();break; case 0xf1:prefix##_##f1();break; case 0xf2:prefix##_##f2();break; case 0xf3:prefix##_##f3();break; \
  546.     case 0xf4:prefix##_##f4();break; case 0xf5:prefix##_##f5();break; case 0xf6:prefix##_##f6();break; case 0xf7:prefix##_##f7();break; \
  547.     case 0xf8:prefix##_##f8();break; case 0xf9:prefix##_##f9();break; case 0xfa:prefix##_##fa();break; case 0xfb:prefix##_##fb();break; \
  548.     case 0xfc:prefix##_##fc();break; case 0xfd:prefix##_##fd();break; case 0xfe:prefix##_##fe();break; case 0xff:prefix##_##ff();break; \
  549.     }                                                                                                                                    \
  550. }
  551. #else
  552. #define EXEC_INLINE EXEC
  553. #endif
  554.  
  555.  
  556. /***************************************************************
  557.  * Enter HALT state; write 1 to fake port on first execution
  558.  ***************************************************************/
  559. #define ENTER_HALT {                                            \
  560.     _PC--;                                                      \
  561.     _HALT = 1;                                                  \
  562.     if( !after_EI )                                             \
  563.         z80_burn( z80_ICount );                                 \
  564. }
  565.  
  566. /***************************************************************
  567.  * Leave HALT state; write 0 to fake port
  568.  ***************************************************************/
  569. #define LEAVE_HALT {                                            \
  570.     if( _HALT )                                                 \
  571.     {                                                            \
  572.         _HALT = 0;                                                \
  573.         _PC++;                                                    \
  574.     }                                                            \
  575. }
  576.  
  577. /***************************************************************
  578.  * Input a byte from given I/O port
  579.  ***************************************************************/
  580. #define IN(port)   ((UINT8)cpu_readport(port))
  581.  
  582. /***************************************************************
  583.  * Output a byte to given I/O port
  584.  ***************************************************************/
  585. #define OUT(port,value) cpu_writeport(port,value)
  586.  
  587. /***************************************************************
  588.  * Read a byte from given memory location
  589.  ***************************************************************/
  590. #define RM(addr) (UINT8)cpu_readmem16(addr)
  591.  
  592. /***************************************************************
  593.  * Read a word from given memory location
  594.  ***************************************************************/
  595. INLINE void RM16( UINT32 addr, PAIR *r )
  596. {
  597.     r->b.l = RM(addr);
  598.     r->b.h = RM((addr+1)&0xffff);
  599. }
  600.  
  601. /***************************************************************
  602.  * Write a byte to given memory location
  603.  ***************************************************************/
  604. #define WM(addr,value) cpu_writemem16(addr,value)
  605.  
  606. /***************************************************************
  607.  * Write a word to given memory location
  608.  ***************************************************************/
  609. INLINE void WM16( UINT32 addr, PAIR *r )
  610. {
  611.     WM(addr,r->b.l);
  612.     WM((addr+1)&0xffff,r->b.h);
  613. }
  614.  
  615. /***************************************************************
  616.  * ROP() is identical to RM() except it is used for
  617.  * reading opcodes. In case of system with memory mapped I/O,
  618.  * this function can be used to greatly speed up emulation
  619.  ***************************************************************/
  620. INLINE UINT8 ROP(void)
  621. {
  622.     unsigned pc = _PCD;
  623.     _PC++;
  624.     return cpu_readop(pc);
  625. }
  626.  
  627. /****************************************************************
  628.  * ARG() is identical to ROP() except it is used
  629.  * for reading opcode arguments. This difference can be used to
  630.  * support systems that use different encoding mechanisms for
  631.  * opcodes and opcode arguments
  632.  ***************************************************************/
  633. INLINE UINT8 ARG(void)
  634. {
  635.     unsigned pc = _PCD;
  636.     _PC++;
  637.     return cpu_readop_arg(pc);
  638. }
  639.  
  640. INLINE UINT32 ARG16(void)
  641. {
  642.     unsigned pc = _PCD;
  643.     _PC += 2;
  644.     return cpu_readop_arg(pc) | (cpu_readop_arg((pc+1)&0xffff) << 8);
  645. }
  646.  
  647. /***************************************************************
  648.  * Calculate the effective address EA of an opcode using
  649.  * IX+offset resp. IY+offset addressing.
  650.  ***************************************************************/
  651. #define EAX EA = (UINT32)(UINT16)(_IX+(INT8)ARG())
  652. #define EAY EA = (UINT32)(UINT16)(_IY+(INT8)ARG())
  653.  
  654. /***************************************************************
  655.  * POP
  656.  ***************************************************************/
  657. #define POP(DR) { RM16( _SPD, &Z80.DR ); _SP += 2; }
  658.  
  659. /***************************************************************
  660.  * PUSH
  661.  ***************************************************************/
  662. #define PUSH(SR) { _SP -= 2; WM16( _SPD, &Z80.SR ); }
  663.  
  664. /***************************************************************
  665.  * JP
  666.  ***************************************************************/
  667. #if BUSY_LOOP_HACKS
  668. #define JP {                                                    \
  669.     unsigned oldpc = _PCD-1;                                    \
  670.     _PCD = ARG16();                                             \
  671.     change_pc16(_PCD);                                            \
  672.     /* speed up busy loop */                                    \
  673.     if( _PCD == oldpc )                                         \
  674.     {                                                            \
  675.         if( !after_EI )                                         \
  676.             BURNODD( z80_ICount, 1, 10 );                        \
  677.     }                                                            \
  678.     else                                                        \
  679.     {                                                            \
  680.         UINT8 op = cpu_readop(_PCD);                            \
  681.         if( _PCD == oldpc-1 )                                    \
  682.         {                                                        \
  683.             /* NOP - JP $-1 or EI - JP $-1 */                    \
  684.             if ( op == 0x00 || op == 0xfb )                     \
  685.             {                                                    \
  686.                 if( !after_EI )                                 \
  687.                     BURNODD( z80_ICount-4, 2, 4+10 );            \
  688.             }                                                    \
  689.         }                                                        \
  690.         else                                                    \
  691.         /* LD SP,#xxxx - JP $-3 (Galaga) */                     \
  692.         if( _PCD == oldpc-3 && op == 0x31 )                     \
  693.         {                                                        \
  694.             if( !after_EI )                                     \
  695.                 BURNODD( z80_ICount-10, 2, 10+10 );             \
  696.         }                                                        \
  697.     }                                                            \
  698. }
  699. #else
  700. #define JP {                                                    \
  701.     _PCD = ARG16();                                             \
  702.     change_pc16(_PCD);                                            \
  703. }
  704. #endif
  705.  
  706. /***************************************************************
  707.  * JP_COND
  708.  ***************************************************************/
  709.  
  710. #define JP_COND(cond)                                            \
  711.     if( cond )                                                    \
  712.     {                                                            \
  713.         _PCD = ARG16();                                         \
  714.         change_pc16(_PCD);                                        \
  715.     }                                                            \
  716.     else                                                        \
  717.     {                                                            \
  718.         _PC += 2;                                                \
  719.     }
  720.  
  721. /***************************************************************
  722.  * JR
  723.  ***************************************************************/
  724. #define JR()                                                    \
  725. {                                                                \
  726.     unsigned oldpc = _PCD-1;                                    \
  727.     INT8 arg = (INT8)ARG(); /* ARG() also increments _PC */     \
  728.     _PC += arg;             /* so don't do _PC += ARG() */      \
  729.     change_pc16(_PCD);                                            \
  730.     /* speed up busy loop */                                    \
  731.     if( _PCD == oldpc )                                         \
  732.     {                                                            \
  733.         if( !after_EI )                                         \
  734.             BURNODD( z80_ICount, 1, 12 );                        \
  735.     }                                                            \
  736.     else                                                        \
  737.     {                                                            \
  738.         UINT8 op = cpu_readop(_PCD);                            \
  739.         if( _PCD == oldpc-1 )                                    \
  740.         {                                                        \
  741.             /* NOP - JR $-1 or EI - JR $-1 */                    \
  742.             if ( op == 0x00 || op == 0xfb )                     \
  743.             {                                                    \
  744.                 if( !after_EI )                                 \
  745.                     BURNODD( z80_ICount-4, 2, 4+12 );            \
  746.             }                                                    \
  747.         }                                                        \
  748.         else                                                    \
  749.         /* LD SP,#xxxx - JR $-3 */                                \
  750.         if( _PCD == oldpc-3 && op == 0x31 )                     \
  751.         {                                                        \
  752.             if( !after_EI )                                     \
  753.                 BURNODD( z80_ICount-12, 2, 10+12 );             \
  754.         }                                                        \
  755.     }                                                           \
  756. }
  757.  
  758. /***************************************************************
  759.  * JR_COND
  760.  ***************************************************************/
  761. #define JR_COND(cond)                                            \
  762.     if( cond )                                                    \
  763.     {                                                            \
  764.         INT8 arg = (INT8)ARG(); /* ARG() also increments _PC */ \
  765.         _PC += arg;             /* so don't do _PC += ARG() */  \
  766.         CY(5);                                                  \
  767.         change_pc16(_PCD);                                        \
  768.     }                                                            \
  769.     else _PC++;                                                 \
  770.  
  771. /***************************************************************
  772.  * CALL
  773.  ***************************************************************/
  774. #define CALL(cond)                                                \
  775.     if( cond )                                                    \
  776.     {                                                            \
  777.         EA = ARG16();                                            \
  778.         PUSH( PC );                                             \
  779.         _PCD = EA;                                                \
  780.         CY(7);                                                  \
  781.         change_pc16(_PCD);                                        \
  782.     }                                                            \
  783.     else                                                        \
  784.     {                                                            \
  785.         _PC+=2;                                                 \
  786.     }
  787.  
  788. /***************************************************************
  789.  * RET
  790.  ***************************************************************/
  791. #define RET(cond)                                                \
  792.     if( cond )                                                    \
  793.     {                                                            \
  794.         POP(PC);                                                \
  795.         change_pc16(_PCD);                                        \
  796.         CY(6);                                                    \
  797.     }
  798.  
  799. /***************************************************************
  800.  * RETN
  801.  ***************************************************************/
  802. #define RETN    {                                                \
  803.     LOG(("Z80#%d RETN IFF1:%d IFF2:%d\n", cpu_getactivecpu(), _IFF1, _IFF2)); \
  804.     RET(1);                                                     \
  805.     if( _IFF1 == 0 && _IFF2 == 1 )                                \
  806.     {                                                            \
  807.         _IFF1 = 1;                                                \
  808.         if( Z80.irq_state != CLEAR_LINE ||                        \
  809.             Z80.request_irq >= 0 )                                \
  810.         {                                                        \
  811.             LOG(("Z80#%d RETN takes IRQ\n",           \
  812.                 cpu_getactivecpu()));                            \
  813.             take_interrupt();                                    \
  814.         }                                                       \
  815.     }                                                            \
  816.     else _IFF1 = _IFF2;                                         \
  817. }
  818.  
  819. /***************************************************************
  820.  * RETI
  821.  ***************************************************************/
  822. #define RETI    {                                                \
  823.     int device = Z80.service_irq;                                \
  824.     RET(1);                                                     \
  825. /* according to http://www.msxnet.org/tech/Z80/z80undoc.txt */    \
  826. /*    _IFF1 = _IFF2;    */                                            \
  827.     if( device >= 0 )                                            \
  828.     {                                                            \
  829.         LOG(("Z80#%d RETI device %d: $%02x\n",         \
  830.             cpu_getactivecpu(), device, Z80.irq[device].irq_param)); \
  831.         Z80.irq[device].interrupt_reti(Z80.irq[device].irq_param); \
  832.     }                                                            \
  833. }
  834.  
  835. /***************************************************************
  836.  * LD    R,A
  837.  ***************************************************************/
  838. #define LD_R_A {                                                \
  839.     _R = _A;                                                    \
  840.     _R2 = _A & 0x80;                /* keep bit 7 of R */        \
  841. }
  842.  
  843. /***************************************************************
  844.  * LD    A,R
  845.  ***************************************************************/
  846. #define LD_A_R {                                                \
  847.     _A = (_R & 0x7f) | _R2;                                     \
  848.     _F = (_F & CF) | SZ[_A] | ( _IFF2 << 2 );                    \
  849. }
  850.  
  851. /***************************************************************
  852.  * LD    I,A
  853.  ***************************************************************/
  854. #define LD_I_A {                                                \
  855.     _I = _A;                                                    \
  856. }
  857.  
  858. /***************************************************************
  859.  * LD    A,I
  860.  ***************************************************************/
  861. #define LD_A_I {                                                \
  862.     _A = _I;                                                    \
  863.     _F = (_F & CF) | SZ[_A] | ( _IFF2 << 2 );                    \
  864. }
  865.  
  866. /***************************************************************
  867.  * RST
  868.  ***************************************************************/
  869. #define RST(addr)                                                \
  870.     PUSH( PC );                                                 \
  871.     _PCD = addr;                                                \
  872.     change_pc16(_PCD)
  873.  
  874. /***************************************************************
  875.  * INC    r8
  876.  ***************************************************************/
  877. INLINE UINT8 INC(UINT8 value)
  878. {
  879.     UINT8 res = value + 1;
  880.     _F = (_F & CF) | SZHV_inc[res];
  881.     return (UINT8)res;
  882. }
  883.  
  884. /***************************************************************
  885.  * DEC    r8
  886.  ***************************************************************/
  887. INLINE UINT8 DEC(UINT8 value)
  888. {
  889.     UINT8 res = value - 1;
  890.     _F = (_F & CF) | SZHV_dec[res];
  891.     return res;
  892. }
  893.  
  894. /***************************************************************
  895.  * RLCA
  896.  ***************************************************************/
  897. #if Z80_EXACT
  898. #define RLCA                                                    \
  899.     _A = (_A << 1) | (_A >> 7);                                 \
  900.     _F = (_F & (SF | ZF | PF)) | (_A & (YF | XF | CF))
  901. #else
  902. #define RLCA                                                    \
  903.     _A = (_A << 1) | (_A >> 7);                                 \
  904.     _F = (_F & (SF | ZF | YF | XF | PF)) | (_A & CF)
  905. #endif
  906.  
  907. /***************************************************************
  908.  * RRCA
  909.  ***************************************************************/
  910. #if Z80_EXACT
  911. #define RRCA                                                    \
  912.     _F = (_F & (SF | ZF | PF)) | (_A & (YF | XF | CF));         \
  913.     _A = (_A >> 1) | (_A << 7)
  914. #else
  915. #define RRCA                                                    \
  916.     _F = (_F & (SF | ZF | YF | XF | PF)) | (_A & CF);            \
  917.     _A = (_A >> 1) | (_A << 7)
  918. #endif
  919.  
  920. /***************************************************************
  921.  * RLA
  922.  ***************************************************************/
  923. #if Z80_EXACT
  924. #define RLA {                                                    \
  925.     UINT8 res = (_A << 1) | (_F & CF);                            \
  926.     UINT8 c = (_A & 0x80) ? CF : 0;                             \
  927.     _F = (_F & (SF | ZF | PF)) | c | (res & (YF | XF));         \
  928.     _A = res;                                                    \
  929. }
  930. #else
  931. #define RLA {                                                   \
  932.     UINT8 res = (_A << 1) | (_F & CF);                            \
  933.     UINT8 c = (_A & 0x80) ? CF : 0;                             \
  934.     _F = (_F & (SF | ZF | YF | XF | PF)) | c;                    \
  935.     _A = res;                                                    \
  936. }
  937. #endif
  938.  
  939. /***************************************************************
  940.  * RRA
  941.  ***************************************************************/
  942. #if Z80_EXACT
  943. #define RRA {                                                   \
  944.     UINT8 res = (_A >> 1) | (_F << 7);                            \
  945.     UINT8 c = (_A & 0x01) ? CF : 0;                             \
  946.     _F = (_F & (SF | ZF | PF)) | c | (res & (YF | XF));         \
  947.     _A = res;                                                    \
  948. }
  949. #else
  950. #define RRA {                                                   \
  951.     UINT8 res = (_A >> 1) | (_F << 7);                            \
  952.     UINT8 c = (_A & 0x01) ? CF : 0;                             \
  953.     _F = (_F & (SF | ZF | YF | XF | PF)) | c;                   \
  954.     _A = res;                                                    \
  955. }
  956. #endif
  957.  
  958. /***************************************************************
  959.  * RRD
  960.  ***************************************************************/
  961. #define RRD {                                                    \
  962.     UINT8 n = RM(_HL);                                            \
  963.     WM( _HL, (n >> 4) | (_A << 4) );                            \
  964.     _A = (_A & 0xf0) | (n & 0x0f);                                \
  965.     _F = (_F & CF) | SZP[_A];                                    \
  966. }
  967.  
  968. /***************************************************************
  969.  * RLD
  970.  ***************************************************************/
  971. #define RLD {                                                   \
  972.     UINT8 n = RM(_HL);                                          \
  973.     WM( _HL, (n << 4) | (_A & 0x0f) );                            \
  974.     _A = (_A & 0xf0) | (n >> 4);                                \
  975.     _F = (_F & CF) | SZP[_A];                                    \
  976. }
  977.  
  978. /***************************************************************
  979.  * ADD    A,n
  980.  ***************************************************************/
  981. #ifdef X86_ASM
  982. #if Z80_EXACT
  983. #define ADD(value)                                                \
  984.  asm (                                                            \
  985.  " addb %2,%0           \n"                                     \
  986.  " lahf                 \n"                                     \
  987.  " setob %1             \n" /* al = 1 if overflow */            \
  988.  " addb %1,%1           \n"                                     \
  989.  " addb %1,%1           \n" /* shift to P/V bit position */     \
  990.  " andb $0xd1,%%ah      \n" /* sign, zero, half carry, carry */ \
  991.  " orb %%ah,%1          \n"                                     \
  992.  " movb %0,%%ah         \n" /* get result */                    \
  993.  " andb $0x28,%%ah      \n" /* maks flags 5+3 */                \
  994.  " orb %%ah,%1          \n" /* put them into flags */           \
  995.  :"=r" (_A), "=r" (_F)                                          \
  996.  :"r" (value), "1" (_F), "0" (_A)                               \
  997.  )
  998. #else
  999. #define ADD(value)                                              \
  1000.  asm (                                                            \
  1001.  " addb %2,%0           \n"                                     \
  1002.  " lahf                 \n"                                     \
  1003.  " setob %1             \n" /* al = 1 if overflow */            \
  1004.  " addb %1,%1           \n"                                     \
  1005.  " addb %1,%1           \n" /* shift to P/V bit position */     \
  1006.  " andb $0xd1,%%ah      \n" /* sign, zero, half carry, carry */ \
  1007.  " orb %%ah,%1          \n"                                     \
  1008.  :"=r" (_A), "=r" (_F)                                          \
  1009.  :"r" (value), "1" (_F), "0" (_A)                               \
  1010.  )
  1011. #endif
  1012. #else
  1013. #if BIG_FLAGS_ARRAY
  1014. #define ADD(value)                                                \
  1015. {                                                                \
  1016.     UINT32 ah = _AFD & 0xff00;                                    \
  1017.     UINT32 res = (UINT8)((ah >> 8) + value);                    \
  1018.     _F = SZHVC_add[ah | res];                                    \
  1019.     _A = res;                                                   \
  1020. }
  1021. #else
  1022. #define ADD(value)                                                \
  1023. {                                                                \
  1024.     unsigned val = value;                                        \
  1025.     unsigned res = _A + val;                                    \
  1026.     _F = SZ[(UINT8)res] | ((res >> 8) & CF) |                   \
  1027.         ((_A ^ res ^ val) & HF) |                               \
  1028.         (((val ^ _A ^ 0x80) & (val ^ res) & 0x80) >> 5);        \
  1029.     _A = (UINT8)res;                                            \
  1030. }
  1031. #endif
  1032. #endif
  1033.  
  1034. /***************************************************************
  1035.  * ADC    A,n
  1036.  ***************************************************************/
  1037. #ifdef X86_ASM
  1038. #if Z80_EXACT
  1039. #define ADC(value)                                                \
  1040.  asm (                                                            \
  1041.  " shrb $1,%1           \n"                                     \
  1042.  " adcb %2,%0           \n"                                     \
  1043.  " lahf                 \n"                                     \
  1044.  " setob %1             \n" /* al = 1 if overflow */            \
  1045.  " addb %1,%1           \n" /* shift to P/V bit position */     \
  1046.  " addb %1,%1           \n"                                     \
  1047.  " andb $0xd1,%%ah      \n" /* sign, zero, half carry, carry */ \
  1048.  " orb %%ah,%1          \n" /* combine with P/V */              \
  1049.  " movb %0,%%ah         \n" /* get result */                    \
  1050.  " andb $0x28,%%ah      \n" /* maks flags 5+3 */                \
  1051.  " orb %%ah,%1          \n" /* put them into flags */           \
  1052.  :"=r" (_A), "=r" (_F)                                          \
  1053.  :"r" (value), "1" (_F), "0" (_A)                               \
  1054.  )
  1055. #else
  1056. #define ADC(value)                                              \
  1057.  asm (                                                            \
  1058.  " shrb $1,%1           \n"                                     \
  1059.  " adcb %2,%0           \n"                                     \
  1060.  " lahf                 \n"                                     \
  1061.  " setob %1             \n" /* al = 1 if overflow */            \
  1062.  " addb %1,%1           \n" /* shift to P/V bit position */     \
  1063.  " addb %1,%1           \n"                                     \
  1064.  " andb $0xd1,%%ah      \n" /* sign, zero, half carry, carry */ \
  1065.  " orb %%ah,%1          \n" /* combine with P/V */              \
  1066.  :"=r" (_A), "=r" (_F)                                          \
  1067.  :"r" (value), "1" (_F), "0" (_A)                               \
  1068.  )
  1069. #endif
  1070. #else
  1071. #if BIG_FLAGS_ARRAY
  1072. #define ADC(value)                                                \
  1073. {                                                                \
  1074.     UINT32 ah = _AFD & 0xff00, c = _AFD & 1;                    \
  1075.     UINT32 res = (UINT8)((ah >> 8) + value + c);                \
  1076.     _F = SZHVC_add[(c << 16) | ah | res];                        \
  1077.     _A = res;                                                   \
  1078. }
  1079. #else
  1080. #define ADC(value)                                                \
  1081. {                                                                \
  1082.     unsigned val = value;                                        \
  1083.     unsigned res = _A + val + (_F & CF);                        \
  1084.     _F = SZ[res & 0xff] | ((res >> 8) & CF) |                    \
  1085.         ((_A ^ res ^ val) & HF) |                                \
  1086.         (((val ^ _A ^ 0x80) & (val ^ res) & 0x80) >> 5);        \
  1087.     _A = res;                                                    \
  1088. }
  1089. #endif
  1090. #endif
  1091.  
  1092. /***************************************************************
  1093.  * SUB    n
  1094.  ***************************************************************/
  1095. #ifdef X86_ASM
  1096. #if Z80_EXACT
  1097. #define SUB(value)                                                \
  1098.  asm (                                                            \
  1099.  " subb %2,%0           \n"                                     \
  1100.  " lahf                 \n"                                     \
  1101.  " setob %1             \n" /* al = 1 if overflow */            \
  1102.  " stc                  \n" /* prepare to set N flag */         \
  1103.  " adcb %1,%1           \n" /* shift to P/V bit position */     \
  1104.  " addb %1,%1           \n"                                     \
  1105.  " andb $0xd1,%%ah      \n" /* sign, zero, half carry, carry */ \
  1106.  " orb %%ah,%1          \n" /* combine with P/V */              \
  1107.  " movb %0,%%ah         \n" /* get result */                    \
  1108.  " andb $0x28,%%ah      \n" /* maks flags 5+3 */                \
  1109.  " orb %%ah,%1          \n" /* put them into flags */           \
  1110.  :"=r" (_A), "=r" (_F)                                          \
  1111.  :"r" (value), "1" (_F), "0" (_A)                               \
  1112.  )
  1113. #else
  1114. #define SUB(value)                                              \
  1115.  asm (                                                            \
  1116.  " subb %2,%0           \n"                                     \
  1117.  " lahf                 \n"                                     \
  1118.  " setob %1             \n" /* al = 1 if overflow */            \
  1119.  " stc                  \n" /* prepare to set N flag */         \
  1120.  " adcb %1,%1           \n" /* shift to P/V bit position */     \
  1121.  " addb %1,%1           \n"                                     \
  1122.  " andb $0xd1,%%ah      \n" /* sign, zero, half carry, carry */ \
  1123.  " orb %%ah,%1          \n" /* combine with P/V */              \
  1124.  :"=r" (_A), "=r" (_F)                                          \
  1125.  :"r" (value), "1" (_F), "0" (_A)                               \
  1126.  )
  1127. #endif
  1128. #else
  1129. #if BIG_FLAGS_ARRAY
  1130. #define SUB(value)                                                \
  1131. {                                                                \
  1132.     UINT32 ah = _AFD & 0xff00;                                    \
  1133.     UINT32 res = (UINT8)((ah >> 8) - value);                    \
  1134.     _F = SZHVC_sub[ah | res];                                    \
  1135.     _A = res;                                                   \
  1136. }
  1137. #else
  1138. #define SUB(value)                                                \
  1139. {                                                                \
  1140.     unsigned val = value;                                        \
  1141.     unsigned res = _A - val;                                    \
  1142.     _F = SZ[res & 0xff] | ((res >> 8) & CF) | NF |                \
  1143.         ((_A ^ res ^ val) & HF) |                                \
  1144.         (((val ^ _A) & (_A ^ res) & 0x80) >> 5);                \
  1145.     _A = res;                                                    \
  1146. }
  1147. #endif
  1148. #endif
  1149.  
  1150. /***************************************************************
  1151.  * SBC    A,n
  1152.  ***************************************************************/
  1153. #ifdef X86_ASM
  1154. #if Z80_EXACT
  1155. #define SBC(value)                                                \
  1156.  asm (                                                            \
  1157.  " shrb $1,%1           \n"                                     \
  1158.  " sbbb %2,%0           \n"                                     \
  1159.  " lahf                 \n"                                     \
  1160.  " setob %1             \n" /* al = 1 if overflow */            \
  1161.  " stc                  \n" /* prepare to set N flag */         \
  1162.  " adcb %1,%1           \n" /* shift to P/V bit position */     \
  1163.  " addb %1,%1           \n"                                     \
  1164.  " andb $0xd1,%%ah      \n" /* sign, zero, half carry, carry */ \
  1165.  " orb %%ah,%1          \n" /* combine with P/V */              \
  1166.  " movb %0,%%ah         \n" /* get result */                    \
  1167.  " andb $0x28,%%ah      \n" /* maks flags 5+3 */                \
  1168.  " orb %%ah,%1          \n" /* put them into flags */           \
  1169.  :"=r" (_A), "=r" (_F)                                          \
  1170.  :"r" (value), "1" (_F), "0" (_A)                               \
  1171.  )
  1172. #else
  1173. #define SBC(value)                                              \
  1174.  asm (                                                            \
  1175.  " shrb $1,%1           \n"                                     \
  1176.  " sbbb %2,%0           \n"                                     \
  1177.  " lahf                 \n"                                     \
  1178.  " setob %1             \n" /* al = 1 if overflow */            \
  1179.  " stc                  \n" /* prepare to set N flag */         \
  1180.  " adcb %1,%1           \n" /* shift to P/V bit position */     \
  1181.  " addb %1,%1           \n"                                     \
  1182.  " andb $0xd1,%%ah      \n" /* sign, zero, half carry, carry */ \
  1183.  " orb %%ah,%1          \n" /* combine with P/V */              \
  1184.  :"=r" (_A), "=r" (_F)                                          \
  1185.  :"r" (value), "1" (_F), "0" (_A)                               \
  1186.  )
  1187. #endif
  1188. #else
  1189. #if BIG_FLAGS_ARRAY
  1190. #define SBC(value)                                                \
  1191. {                                                                \
  1192.     UINT32 ah = _AFD & 0xff00, c = _AFD & 1;                    \
  1193.     UINT32 res = (UINT8)((ah >> 8) - value - c);                \
  1194.     _F = SZHVC_sub[(c<<16) | ah | res];                         \
  1195.     _A = res;                                                   \
  1196. }
  1197. #else
  1198. #define SBC(value)                                                \
  1199. {                                                                \
  1200.     unsigned val = value;                                        \
  1201.     unsigned res = _A - val - (_F & CF);                        \
  1202.     _F = SZ[res & 0xff] | ((res >> 8) & CF) | NF |                \
  1203.         ((_A ^ res ^ val) & HF) |                                \
  1204.         (((val ^ _A) & (_A ^ res) & 0x80) >> 5);                \
  1205.     _A = res;                                                    \
  1206. }
  1207. #endif
  1208. #endif
  1209.  
  1210. /***************************************************************
  1211.  * NEG
  1212.  ***************************************************************/
  1213. #define NEG {                                                   \
  1214.     UINT8 value = _A;                                            \
  1215.     _A = 0;                                                     \
  1216.     SUB(value);                                                 \
  1217. }
  1218.  
  1219. /***************************************************************
  1220.  * DAA
  1221.  ***************************************************************/
  1222. #define DAA {                                                    \
  1223.     int idx = _A;                                                \
  1224.     if( _F & CF ) idx |= 0x100;                                 \
  1225.     if( _F & HF ) idx |= 0x200;                                 \
  1226.     if( _F & NF ) idx |= 0x400;                                 \
  1227.     _AF = DAATable[idx];                                        \
  1228. }
  1229.  
  1230. /***************************************************************
  1231.  * AND    n
  1232.  ***************************************************************/
  1233. #define AND(value)                                                \
  1234.     _A &= value;                                                \
  1235.     _F = SZP[_A] | HF
  1236.  
  1237. /***************************************************************
  1238.  * OR    n
  1239.  ***************************************************************/
  1240. #define OR(value)                                                \
  1241.     _A |= value;                                                \
  1242.     _F = SZP[_A]
  1243.  
  1244. /***************************************************************
  1245.  * XOR    n
  1246.  ***************************************************************/
  1247. #define XOR(value)                                                \
  1248.     _A ^= value;                                                \
  1249.     _F = SZP[_A]
  1250.  
  1251. /***************************************************************
  1252.  * CP    n
  1253.  ***************************************************************/
  1254. #ifdef X86_ASM
  1255. #if Z80_EXACT
  1256. #define CP(value)                                                \
  1257.  asm (                                                            \
  1258.  " cmpb %2,%0           \n"                                     \
  1259.  " lahf                 \n"                                     \
  1260.  " setob %1             \n" /* al = 1 if overflow */            \
  1261.  " stc                  \n" /* prepare to set N flag */         \
  1262.  " adcb %1,%1           \n" /* shift to P/V bit position */     \
  1263.  " addb %1,%1           \n"                                     \
  1264.  " andb $0xd1,%%ah      \n" /* sign, zero, half carry, carry */ \
  1265.  " orb %%ah,%1          \n" /* combine with P/V */              \
  1266.  " movb %2,%%ah         \n" /* get result */                    \
  1267.  " andb $0x28,%%ah      \n" /* maks flags 5+3 */                \
  1268.  " orb %%ah,%1          \n" /* put them into flags */           \
  1269.  :"=r" (_A), "=r" (_F)                                          \
  1270.  :"r" (value), "1" (_F), "0" (_A)                               \
  1271.  )
  1272. #else
  1273. #define CP(value)                                               \
  1274.  asm (                                                            \
  1275.  " cmpb %2,%0           \n"                                     \
  1276.  " lahf                 \n"                                     \
  1277.  " setob %1             \n" /* al = 1 if overflow */            \
  1278.  " stc                  \n" /* prepare to set N flag */         \
  1279.  " adcb %1,%1           \n" /* shift to P/V bit position */     \
  1280.  " addb %1,%1           \n"                                     \
  1281.  " andb $0xd1,%%ah      \n" /* sign, zero, half carry, carry */ \
  1282.  " orb %%ah,%1          \n" /* combine with P/V */              \
  1283.  :"=r" (_A), "=r" (_F)                                          \
  1284.  :"r" (value), "1" (_F), "0" (_A)                               \
  1285.  )
  1286. #endif
  1287. #else
  1288. #if BIG_FLAGS_ARRAY
  1289. #define CP(value)                                                \
  1290. {                                                                \
  1291.     UINT32 ah = _AFD & 0xff00;                                    \
  1292.     UINT32 res = (UINT8)((ah >> 8) - value);                    \
  1293.     _F = SZHVC_sub[ah | res];                                    \
  1294. }
  1295. #else
  1296. #define CP(value)                                                \
  1297. {                                                                \
  1298.     unsigned val = value;                                        \
  1299.     unsigned res = _A - val;                                    \
  1300.     _F = SZ[res & 0xff] | ((res >> 8) & CF) | NF |                \
  1301.         ((_A ^ res ^ val) & HF) |                                \
  1302.         ((((val ^ _A) & (_A ^ res)) >> 5) & VF);                \
  1303. }
  1304. #endif
  1305. #endif
  1306.  
  1307. /***************************************************************
  1308.  * EX   AF,AF'
  1309.  ***************************************************************/
  1310. #define EX_AF {                                                 \
  1311.     PAIR tmp;                                                    \
  1312.     tmp = Z80.AF; Z80.AF = Z80.AF2; Z80.AF2 = tmp;              \
  1313. }
  1314.  
  1315. /***************************************************************
  1316.  * EX   DE,HL
  1317.  ***************************************************************/
  1318. #define EX_DE_HL {                                              \
  1319.     PAIR tmp;                                                    \
  1320.     tmp = Z80.DE; Z80.DE = Z80.HL; Z80.HL = tmp;                \
  1321. }
  1322.  
  1323. /***************************************************************
  1324.  * EXX
  1325.  ***************************************************************/
  1326. #define EXX {                                                   \
  1327.     PAIR tmp;                                                    \
  1328.     tmp = Z80.BC; Z80.BC = Z80.BC2; Z80.BC2 = tmp;              \
  1329.     tmp = Z80.DE; Z80.DE = Z80.DE2; Z80.DE2 = tmp;              \
  1330.     tmp = Z80.HL; Z80.HL = Z80.HL2; Z80.HL2 = tmp;              \
  1331. }
  1332.  
  1333. /***************************************************************
  1334.  * EX   (SP),r16
  1335.  ***************************************************************/
  1336. #define EXSP(DR)                                                \
  1337. {                                                                \
  1338.     PAIR tmp = { { 0, 0, 0, 0 } };                                \
  1339.     RM16( _SPD, &tmp );                                         \
  1340.     WM16( _SPD, &Z80.DR );                                        \
  1341.     Z80.DR = tmp;                                                \
  1342. }
  1343.  
  1344.  
  1345. /***************************************************************
  1346.  * ADD16
  1347.  ***************************************************************/
  1348. #ifdef    X86_ASM
  1349. #if Z80_EXACT
  1350. #define ADD16(DR,SR)                                            \
  1351.  asm (                                                            \
  1352.  " andb $0xc4,%1        \n"                                     \
  1353.  " addb %%dl,%%cl       \n"                                     \
  1354.  " adcb %%dh,%%ch       \n"                                     \
  1355.  " lahf                 \n"                                     \
  1356.  " andb $0x11,%%ah      \n"                                     \
  1357.  " orb %%ah,%1          \n"                                     \
  1358.  " movb %%ch,%%ah       \n" /* get result MSB */                \
  1359.  " andb $0x28,%%ah      \n" /* maks flags 5+3 */                \
  1360.  " orb %%ah,%1          \n" /* put them into flags */           \
  1361.  :"=c" (Z80.DR.d), "=r" (_F)                                    \
  1362.  :"0" (Z80.DR.d), "1" (_F), "d" (Z80.SR.d)                      \
  1363.  )
  1364. #else
  1365. #define ADD16(DR,SR)                                            \
  1366.  asm (                                                            \
  1367.  " andb $0xc4,%1        \n"                                     \
  1368.  " addb %%dl,%%cl       \n"                                     \
  1369.  " adcb %%dh,%%ch       \n"                                     \
  1370.  " lahf                 \n"                                     \
  1371.  " andb $0x11,%%ah      \n"                                     \
  1372.  " orb %%ah,%1          \n"                                     \
  1373.  :"=c" (Z80.DR.d), "=r" (_F)                                    \
  1374.  :"0" (Z80.DR.d), "1" (_F), "d" (Z80.SR.d)                      \
  1375.  )
  1376. #endif
  1377. #else
  1378. #define ADD16(DR,SR)                                            \
  1379. {                                                                \
  1380.     UINT32 res = Z80.DR.d + Z80.SR.d;                            \
  1381.     _F = (_F & (SF | ZF | VF)) |                                \
  1382.         (((Z80.DR.d ^ res ^ Z80.SR.d) >> 8) & HF) |             \
  1383.         ((res >> 16) & CF);                                     \
  1384.     Z80.DR.w.l = (UINT16)res;                                    \
  1385. }
  1386. #endif
  1387.  
  1388. /***************************************************************
  1389.  * ADC    r16,r16
  1390.  ***************************************************************/
  1391. #ifdef    X86_ASM
  1392. #if Z80_EXACT
  1393. #define ADC16(Reg)                                                \
  1394.  asm (                                                          \
  1395.  " shrb $1,%1           \n"                                     \
  1396.  " adcb %%dl,%%cl       \n"                                     \
  1397.  " lahf                 \n"                                     \
  1398.  " movb %%ah,%%dl       \n"                                     \
  1399.  " adcb %%dh,%%ch       \n"                                     \
  1400.  " lahf                 \n"                                     \
  1401.  " setob %1             \n"                                     \
  1402.  " orb $0xbf,%%dl       \n" /* set all but zero */              \
  1403.  " addb %1,%1           \n"                                     \
  1404.  " andb $0xd1,%%ah      \n" /* sign,zero,half carry and carry */\
  1405.  " addb %1,%1           \n"                                     \
  1406.  " orb %%ah,%1          \n" /* overflow into P/V */             \
  1407.  " andb %%dl,%1         \n" /* mask zero */                     \
  1408.  " movb %%ch,%%ah       \n" /* get result MSB */                \
  1409.  " andb $0x28,%%ah      \n" /* maks flags 5+3 */                \
  1410.  " orb %%ah,%1          \n" /* put them into flags */           \
  1411.  :"=c" (_HLD), "=r" (_F)                                        \
  1412.  :"0" (_HLD), "1" (_F), "d" (Z80.Reg.d)                         \
  1413.  )
  1414. #else
  1415. #define ADC16(Reg)                                              \
  1416.  asm (                                                          \
  1417.  " shrb $1,%1           \n"                                     \
  1418.  " adcb %%dl,%%cl       \n"                                     \
  1419.  " lahf                 \n"                                     \
  1420.  " movb %%ah,%%dl       \n"                                     \
  1421.  " adcb %%dh,%%ch       \n"                                     \
  1422.  " lahf                 \n"                                     \
  1423.  " setob %1             \n"                                     \
  1424.  " orb $0xbf,%%dl       \n" /* set all but zero */              \
  1425.  " addb %1,%1           \n"                                     \
  1426.  " andb $0xd1,%%ah      \n" /* sign,zero,half carry and carry */\
  1427.  " addb %1,%1           \n"                                     \
  1428.  " orb %%ah,%1          \n" /* overflow into P/V */             \
  1429.  " andb %%dl,%1         \n" /* mask zero */                     \
  1430.  :"=c" (_HLD), "=r" (_F)                                        \
  1431.  :"0" (_HLD), "1" (_F), "d" (Z80.Reg.d)                         \
  1432.  )
  1433. #endif
  1434. #else
  1435. #define ADC16(Reg)                                                \
  1436. {                                                                \
  1437.     UINT32 res = _HLD + Z80.Reg.d + (_F & CF);                    \
  1438.     _F = (((_HLD ^ res ^ Z80.Reg.d) >> 8) & HF) |                \
  1439.         ((res >> 16) & CF) |                                    \
  1440.         ((res >> 8) & SF) |                                     \
  1441.         ((res & 0xffff) ? 0 : ZF) |                             \
  1442.         (((Z80.Reg.d ^ _HLD ^ 0x8000) & (Z80.Reg.d ^ res) & 0x8000) >> 13); \
  1443.     _HL = (UINT16)res;                                            \
  1444. }
  1445. #endif
  1446.  
  1447. /***************************************************************
  1448.  * SBC    r16,r16
  1449.  ***************************************************************/
  1450. #ifdef    X86_ASM
  1451. #if Z80_EXACT
  1452. #define SBC16(Reg)                                                \
  1453. asm (                                                            \
  1454.  " shrb $1,%1           \n"                                     \
  1455.  " sbbb %%dl,%%cl       \n"                                     \
  1456.  " lahf                 \n"                                     \
  1457.  " movb %%ah,%%dl       \n"                                     \
  1458.  " sbbb %%dh,%%ch       \n"                                     \
  1459.  " lahf                 \n"                                     \
  1460.  " setob %1             \n"                                     \
  1461.  " orb $0xbf,%%dl       \n" /* set all but zero */              \
  1462.  " stc                  \n"                                     \
  1463.  " adcb %1,%1           \n"                                     \
  1464.  " andb $0xd1,%%ah      \n" /* sign,zero,half carry and carry */\
  1465.  " addb %1,%1           \n"                                     \
  1466.  " orb %%ah,%1          \n" /* overflow into P/V */             \
  1467.  " andb %%dl,%1         \n" /* mask zero */                     \
  1468.  " movb %%ch,%%ah       \n" /* get result MSB */                \
  1469.  " andb $0x28,%%ah      \n" /* maks flags 5+3 */                \
  1470.  " orb %%ah,%1          \n" /* put them into flags */           \
  1471.  :"=c" (_HLD), "=r" (_F)                                        \
  1472.  :"0" (_HLD), "1" (_F), "d" (Z80.Reg.d)                         \
  1473.  )
  1474. #else
  1475. #define SBC16(Reg)                                              \
  1476. asm (                                                            \
  1477.  " shrb $1,%1           \n"                                     \
  1478.  " sbbb %%dl,%%cl       \n"                                     \
  1479.  " lahf                 \n"                                     \
  1480.  " movb %%ah,%%dl       \n"                                     \
  1481.  " sbbb %%dh,%%ch       \n"                                     \
  1482.  " lahf                 \n"                                     \
  1483.  " setob %1             \n"                                     \
  1484.  " orb $0xbf,%%dl       \n" /* set all but zero */              \
  1485.  " stc                  \n"                                     \
  1486.  " adcb %1,%1           \n"                                     \
  1487.  " andb $0xd1,%%ah      \n" /* sign,zero,half carry and carry */\
  1488.  " addb %1,%1           \n"                                     \
  1489.  " orb %%ah,%1          \n" /* overflow into P/V */             \
  1490.  " andb %%dl,%1         \n" /* mask zero */                     \
  1491.  :"=c" (_HLD), "=r" (_F)                                        \
  1492.  :"0" (_HLD), "1" (_F), "d" (Z80.Reg.d)                         \
  1493.  )
  1494. #endif
  1495. #else
  1496. #define SBC16(Reg)                                                \
  1497. {                                                                \
  1498.     UINT32 res = _HLD - Z80.Reg.d - (_F & CF);                    \
  1499.     _F = (((_HLD ^ res ^ Z80.Reg.d) >> 8) & HF) | NF |            \
  1500.         ((res >> 16) & CF) |                                    \
  1501.         ((res >> 8) & SF) |                                     \
  1502.         ((res & 0xffff) ? 0 : ZF) |                             \
  1503.         (((Z80.Reg.d ^ _HLD) & (_HLD ^ res) &0x8000) >> 13);    \
  1504.     _HL = (UINT16)res;                                            \
  1505. }
  1506. #endif
  1507.  
  1508. /***************************************************************
  1509.  * RLC    r8
  1510.  ***************************************************************/
  1511. INLINE UINT8 RLC(UINT8 value)
  1512. {
  1513.     unsigned res = value;
  1514.     unsigned c = (res & 0x80) ? CF : 0;
  1515.     res = ((res << 1) | (res >> 7)) & 0xff;
  1516.     _F = SZP[res] | c;
  1517.     return res;
  1518. }
  1519.  
  1520. /***************************************************************
  1521.  * RRC    r8
  1522.  ***************************************************************/
  1523. INLINE UINT8 RRC(UINT8 value)
  1524. {
  1525.     unsigned res = value;
  1526.     unsigned c = (res & 0x01) ? CF : 0;
  1527.     res = ((res >> 1) | (res << 7)) & 0xff;
  1528.     _F = SZP[res] | c;
  1529.     return res;
  1530. }
  1531.  
  1532. /***************************************************************
  1533.  * RL    r8
  1534.  ***************************************************************/
  1535. INLINE UINT8 RL(UINT8 value)
  1536. {
  1537.     unsigned res = value;
  1538.     unsigned c = (res & 0x80) ? CF : 0;
  1539.     res = ((res << 1) | (_F & CF)) & 0xff;
  1540.     _F = SZP[res] | c;
  1541.     return res;
  1542. }
  1543.  
  1544. /***************************************************************
  1545.  * RR    r8
  1546.  ***************************************************************/
  1547. INLINE UINT8 RR(UINT8 value)
  1548. {
  1549.     unsigned res = value;
  1550.     unsigned c = (res & 0x01) ? CF : 0;
  1551.     res = ((res >> 1) | (_F << 7)) & 0xff;
  1552.     _F = SZP[res] | c;
  1553.     return res;
  1554. }
  1555.  
  1556. /***************************************************************
  1557.  * SLA    r8
  1558.  ***************************************************************/
  1559. INLINE UINT8 SLA(UINT8 value)
  1560. {
  1561.     unsigned res = value;
  1562.     unsigned c = (res & 0x80) ? CF : 0;
  1563.     res = (res << 1) & 0xff;
  1564.     _F = SZP[res] | c;
  1565.     return res;
  1566. }
  1567.  
  1568. /***************************************************************
  1569.  * SRA    r8
  1570.  ***************************************************************/
  1571. INLINE UINT8 SRA(UINT8 value)
  1572. {
  1573.     unsigned res = value;
  1574.     unsigned c = (res & 0x01) ? CF : 0;
  1575.     res = ((res >> 1) | (res & 0x80)) & 0xff;
  1576.     _F = SZP[res] | c;
  1577.     return res;
  1578. }
  1579.  
  1580. /***************************************************************
  1581.  * SLL    r8
  1582.  ***************************************************************/
  1583. INLINE UINT8 SLL(UINT8 value)
  1584. {
  1585.     unsigned res = value;
  1586.     unsigned c = (res & 0x80) ? CF : 0;
  1587.     res = ((res << 1) | 0x01) & 0xff;
  1588.     _F = SZP[res] | c;
  1589.     return res;
  1590. }
  1591.  
  1592. /***************************************************************
  1593.  * SRL    r8
  1594.  ***************************************************************/
  1595. INLINE UINT8 SRL(UINT8 value)
  1596. {
  1597.     unsigned res = value;
  1598.     unsigned c = (res & 0x01) ? CF : 0;
  1599.     res = (res >> 1) & 0xff;
  1600.     _F = SZP[res] | c;
  1601.     return res;
  1602. }
  1603.  
  1604. /***************************************************************
  1605.  * BIT  bit,r8
  1606.  ***************************************************************/
  1607. #define BIT(bit,reg)                                            \
  1608.     _F = (_F & CF) | HF | SZ_BIT[reg & (1<<bit)]
  1609.  
  1610. /***************************************************************
  1611.  * BIT    bit,(IX/Y+o)
  1612.  ***************************************************************/
  1613. #if Z80_EXACT
  1614. #define BIT_XY(bit,reg)                                         \
  1615.     _F = (_F & CF) | HF | (SZ_BIT[reg & (1<<bit)] & ~(YF|XF)) | ((EA>>8) & (YF|XF))
  1616. #else
  1617. #define BIT_XY    BIT
  1618. #endif
  1619.  
  1620. /***************************************************************
  1621.  * RES    bit,r8
  1622.  ***************************************************************/
  1623. INLINE UINT8 RES(UINT8 bit, UINT8 value)
  1624. {
  1625.     return value & ~(1<<bit);
  1626. }
  1627.  
  1628. /***************************************************************
  1629.  * SET  bit,r8
  1630.  ***************************************************************/
  1631. INLINE UINT8 SET(UINT8 bit, UINT8 value)
  1632. {
  1633.     return value | (1<<bit);
  1634. }
  1635.  
  1636. /***************************************************************
  1637.  * LDI
  1638.  ***************************************************************/
  1639. #if Z80_EXACT
  1640. #define LDI {                                                    \
  1641.     UINT8 io = RM(_HL);                                         \
  1642.     WM( _DE, io );                                                \
  1643.     _F &= SF | ZF | CF;                                         \
  1644.     if( (_A + io) & 0x02 ) _F |= YF; /* bit 1 -> flag 5 */        \
  1645.     if( (_A + io) & 0x08 ) _F |= XF; /* bit 3 -> flag 3 */      \
  1646.     _HL++; _DE++; _BC--;                                        \
  1647.     if( _BC ) _F |= VF;                                         \
  1648. }
  1649. #else
  1650. #define LDI {                                                   \
  1651.     WM( _DE, RM(_HL) );                                         \
  1652.     _F &= SF | ZF | YF | XF | CF;                               \
  1653.     _HL++; _DE++; _BC--;                                        \
  1654.     if( _BC ) _F |= VF;                                         \
  1655. }
  1656. #endif
  1657.  
  1658. /***************************************************************
  1659.  * CPI
  1660.  ***************************************************************/
  1661. #if Z80_EXACT
  1662. #define CPI {                                                    \
  1663.     UINT8 val = RM(_HL);                                        \
  1664.     UINT8 res = _A - val;                                        \
  1665.     _HL++; _BC--;                                                \
  1666.     _F = (_F & CF) | (SZ[res] & ~(YF|XF)) | ((_A ^ val ^ res) & HF) | NF;  \
  1667.     if( _F & HF ) res -= 1;                                     \
  1668.     if( res & 0x02 ) _F |= YF; /* bit 1 -> flag 5 */            \
  1669.     if( res & 0x08 ) _F |= XF; /* bit 3 -> flag 3 */            \
  1670.     if( _BC ) _F |= VF;                                         \
  1671. }
  1672. #else
  1673. #define CPI {                                                   \
  1674.     UINT8 val = RM(_HL);                                        \
  1675.     UINT8 res = _A - val;                                        \
  1676.     _HL++; _BC--;                                                \
  1677.     _F = (_F & CF) | SZ[res] | ((_A ^ val ^ res) & HF) | NF;    \
  1678.     if( _BC ) _F |= VF;                                         \
  1679. }
  1680. #endif
  1681.  
  1682. /***************************************************************
  1683.  * INI
  1684.  ***************************************************************/
  1685. #if Z80_EXACT
  1686. #define INI {                                                    \
  1687.     UINT8 io = IN(_BC);                                         \
  1688.     _B--;                                                       \
  1689.     WM( _HL, io );                                                \
  1690.     _HL++;                                                        \
  1691.     _F = SZ[_B];                                                \
  1692.     if( io & SF ) _F |= NF;                                     \
  1693.     if( (_C + io + 1) & 0x100 ) _F |= HF | CF;                    \
  1694.     if( (irep_tmp1[_C & 3][io & 3] ^                            \
  1695.          breg_tmp2[_B] ^                                        \
  1696.          (_C >> 2) ^                                            \
  1697.          (io >> 2)) & 1 )                                        \
  1698.         _F |= PF;                                                \
  1699. }
  1700. #else
  1701. #define INI {                                                    \
  1702.     _B--;                                                       \
  1703.     WM( _HL, IN(_BC) );                                         \
  1704.     _HL++;                                                        \
  1705.     _F = (_B) ? NF : NF | ZF;                                    \
  1706. }
  1707. #endif
  1708.  
  1709. /***************************************************************
  1710.  * OUTI
  1711.  ***************************************************************/
  1712. #if Z80_EXACT
  1713. #define OUTI {                                                    \
  1714.     UINT8 io = RM(_HL);                                         \
  1715.     _B--;                                                       \
  1716.     OUT( _BC, io );                                             \
  1717.     _HL++;                                                        \
  1718.     _F = SZ[_B];                                                \
  1719.     if( io & SF ) _F |= NF;                                     \
  1720.     if( (_C + io + 1) & 0x100 ) _F |= HF | CF;                    \
  1721.     if( (irep_tmp1[_C & 3][io & 3] ^                            \
  1722.          breg_tmp2[_B] ^                                        \
  1723.          (_C >> 2) ^                                            \
  1724.          (io >> 2)) & 1 )                                        \
  1725.         _F |= PF;                                               \
  1726. }
  1727. #else
  1728. #define OUTI {                                                    \
  1729.     _B--;                                                       \
  1730.     OUT( _BC, RM(_HL) );                                        \
  1731.     _HL++;                                                      \
  1732.     _F = (_B) ? NF : NF | ZF;                                   \
  1733. }
  1734. #endif
  1735.  
  1736. /***************************************************************
  1737.  * LDD
  1738.  ***************************************************************/
  1739. #if Z80_EXACT
  1740. #define LDD {                                                    \
  1741.     UINT8 io = RM(_HL);                                         \
  1742.     WM( _DE, io );                                                \
  1743.     _F &= SF | ZF | CF;                                         \
  1744.     if( (_A + io) & 0x02 ) _F |= YF; /* bit 1 -> flag 5 */        \
  1745.     if( (_A + io) & 0x08 ) _F |= XF; /* bit 3 -> flag 3 */        \
  1746.     _HL--; _DE--; _BC--;                                        \
  1747.     if( _BC ) _F |= VF;                                         \
  1748. }
  1749. #else
  1750. #define LDD {                                                   \
  1751.     WM( _DE, RM(_HL) );                                         \
  1752.     _F &= SF | ZF | YF | XF | CF;                               \
  1753.     _HL--; _DE--; _BC--;                                        \
  1754.     if( _BC ) _F |= VF;                                         \
  1755. }
  1756. #endif
  1757.  
  1758. /***************************************************************
  1759.  * CPD
  1760.  ***************************************************************/
  1761. #if Z80_EXACT
  1762. #define CPD {                                                    \
  1763.     UINT8 val = RM(_HL);                                        \
  1764.     UINT8 res = _A - val;                                        \
  1765.     _HL--; _BC--;                                                \
  1766.     _F = (_F & CF) | (SZ[res] & ~(YF|XF)) | ((_A ^ val ^ res) & HF) | NF;  \
  1767.     if( _F & HF ) res -= 1;                                     \
  1768.     if( res & 0x02 ) _F |= YF; /* bit 1 -> flag 5 */            \
  1769.     if( res & 0x08 ) _F |= XF; /* bit 3 -> flag 3 */            \
  1770.     if( _BC ) _F |= VF;                                         \
  1771. }
  1772. #else
  1773. #define CPD {                                                   \
  1774.     UINT8 val = RM(_HL);                                        \
  1775.     UINT8 res = _A - val;                                        \
  1776.     _HL--; _BC--;                                                \
  1777.     _F = (_F & CF) | SZ[res] | ((_A ^ val ^ res) & HF) | NF;    \
  1778.     if( _BC ) _F |= VF;                                         \
  1779. }
  1780. #endif
  1781.  
  1782. /***************************************************************
  1783.  * IND
  1784.  ***************************************************************/
  1785. #if Z80_EXACT
  1786. #define IND {                                                    \
  1787.     UINT8 io = IN(_BC);                                         \
  1788.     _B--;                                                        \
  1789.     WM( _HL, io );                                                \
  1790.     _HL--;                                                        \
  1791.     _F = SZ[_B];                                                \
  1792.     if( io & SF ) _F |= NF;                                     \
  1793.     if( (_C + io - 1) & 0x100 ) _F |= HF | CF;                    \
  1794.     if( (drep_tmp1[_C & 3][io & 3] ^                            \
  1795.          breg_tmp2[_B] ^                                        \
  1796.          (_C >> 2) ^                                            \
  1797.          (io >> 2)) & 1 )                                        \
  1798.         _F |= PF;                                               \
  1799. }
  1800. #else
  1801. #define IND {                                                   \
  1802.     _B--;                                                        \
  1803.     WM( _HL, IN(_BC) );                                         \
  1804.     _HL--;                                                        \
  1805.     _F = (_B) ? NF : NF | ZF;                                    \
  1806. }
  1807. #endif
  1808.  
  1809. /***************************************************************
  1810.  * OUTD
  1811.  ***************************************************************/
  1812. #if Z80_EXACT
  1813. #define OUTD {                                                    \
  1814.     UINT8 io = RM(_HL);                                         \
  1815.     _B--;                                                       \
  1816.     OUT( _BC, io );                                             \
  1817.     _HL--;                                                        \
  1818.     _F = SZ[_B];                                                \
  1819.     if( io & SF ) _F |= NF;                                     \
  1820.     if( (_C + io - 1) & 0x100 ) _F |= HF | CF;                    \
  1821.     if( (drep_tmp1[_C & 3][io & 3] ^                            \
  1822.          breg_tmp2[_B] ^                                        \
  1823.          (_C >> 2) ^                                            \
  1824.          (io >> 2)) & 1 )                                        \
  1825.         _F |= PF;                                               \
  1826. }
  1827. #else
  1828. #define OUTD {                                                  \
  1829.     _B--;                                                       \
  1830.     OUT( _BC, RM(_HL) );                                        \
  1831.     _HL--;                                                        \
  1832.     _F = (_B) ? NF : NF | ZF;                                    \
  1833. }
  1834. #endif
  1835.  
  1836. /***************************************************************
  1837.  * LDIR
  1838.  ***************************************************************/
  1839. #if REPEAT_AT_ONCE
  1840. #define LDIR {                                                  \
  1841.     CY(5);                                                        \
  1842.     _PC -= 2;                                                    \
  1843.     do                                                            \
  1844.     {                                                            \
  1845.         LDI;                                                    \
  1846.         if( _BC )                                                \
  1847.         {                                                        \
  1848.             if( z80_ICount > 0 )                                \
  1849.             {                                                    \
  1850.                 _R += 2;  /* increment R twice */                \
  1851.                 CY(21);                                         \
  1852.             }                                                    \
  1853.             else break;                                         \
  1854.         }                                                        \
  1855.         else                                                    \
  1856.         {                                                        \
  1857.             _PC += 2;                                            \
  1858.             z80_ICount += 5;                                    \
  1859.             break;                                              \
  1860.         }                                                        \
  1861.     } while( z80_ICount > 0 );                                    \
  1862. }
  1863. #else
  1864. #define LDIR LDI; if( _BC ) { _PC -= 2; CY(5); }
  1865. #endif
  1866.  
  1867. /***************************************************************
  1868.  * CPIR
  1869.  ***************************************************************/
  1870. #if REPEAT_AT_ONCE
  1871. #define CPIR {                                                  \
  1872.     CY(5);                                                        \
  1873.     _PC -= 2;                                                    \
  1874.     do                                                          \
  1875.     {                                                            \
  1876.         CPI;                                                    \
  1877.         if( _BC && !(_F & ZF) )                                 \
  1878.         {                                                        \
  1879.             if( z80_ICount > 0 )                                \
  1880.             {                                                   \
  1881.                 _R += 2;  /* increment R twice */                \
  1882.                 CY(21);                                         \
  1883.             }                                                    \
  1884.             else break;                                         \
  1885.         }                                                       \
  1886.         else                                                    \
  1887.         {                                                        \
  1888.             _PC += 2;                                            \
  1889.             z80_ICount += 5;                                    \
  1890.             break;                                              \
  1891.         }                                                        \
  1892.     } while( z80_ICount > 0 );                                    \
  1893. }
  1894. #else
  1895. #define CPIR CPI; if( _BC && !(_F & ZF) ) { _PC -= 2; CY(5); }
  1896. #endif
  1897.  
  1898. /***************************************************************
  1899.  * INIR
  1900.  ***************************************************************/
  1901. #if REPEAT_AT_ONCE
  1902. #define INIR {                                                  \
  1903.     CY(5);                                                        \
  1904.     _PC -= 2;                                                    \
  1905.     do                                                          \
  1906.     {                                                            \
  1907.         INI;                                                    \
  1908.         if( _B )                                                \
  1909.         {                                                        \
  1910.             if( z80_ICount > 0 )                                \
  1911.             {                                                   \
  1912.                 _R += 2;  /* increment R twice */                \
  1913.                 CY(21);                                         \
  1914.             }                                                    \
  1915.             else break;                                         \
  1916.         }                                                       \
  1917.         else                                                    \
  1918.         {                                                        \
  1919.             _PC += 2;                                            \
  1920.             z80_ICount += 5;                                    \
  1921.             break;                                              \
  1922.         }                                                        \
  1923.     } while( z80_ICount > 0 );                                    \
  1924. }
  1925. #else
  1926. #define INIR INI; if( _B ) { _PC -= 2; CY(5); }
  1927. #endif
  1928.  
  1929. /***************************************************************
  1930.  * OTIR
  1931.  ***************************************************************/
  1932. #if REPEAT_AT_ONCE
  1933. #define OTIR {                                                  \
  1934.     CY(5);                                                        \
  1935.     _PC -= 2;                                                    \
  1936.     do                                                          \
  1937.     {                                                            \
  1938.         OUTI;                                                    \
  1939.         if( _B    )                                                \
  1940.         {                                                        \
  1941.             if( z80_ICount > 0 )                                \
  1942.             {                                                   \
  1943.                 _R += 2;  /* increment R twice */                \
  1944.                 CY(21);                                         \
  1945.             }                                                    \
  1946.             else break;                                         \
  1947.         }                                                       \
  1948.         else                                                    \
  1949.         {                                                        \
  1950.             _PC += 2;                                            \
  1951.             z80_ICount += 5;                                    \
  1952.             break;                                              \
  1953.         }                                                        \
  1954.     } while( z80_ICount > 0 );                                    \
  1955. }
  1956. #else
  1957. #define OTIR OUTI; if( _B ) { _PC -= 2; CY(5); }
  1958. #endif
  1959.  
  1960. /***************************************************************
  1961.  * LDDR
  1962.  ***************************************************************/
  1963. #if REPEAT_AT_ONCE
  1964. #define LDDR {                                                  \
  1965.     CY(5);                                                        \
  1966.     _PC -= 2;                                                    \
  1967.     do                                                          \
  1968.     {                                                            \
  1969.         LDD;                                                    \
  1970.         if( _BC )                                                \
  1971.         {                                                        \
  1972.             if( z80_ICount > 0 )                                \
  1973.             {                                                   \
  1974.                 _R += 2;  /* increment R twice */                \
  1975.                 CY(21);                                         \
  1976.             }                                                    \
  1977.             else break;                                         \
  1978.         }                                                       \
  1979.         else                                                    \
  1980.         {                                                        \
  1981.             _PC += 2;                                            \
  1982.             z80_ICount += 5;                                    \
  1983.             break;                                              \
  1984.         }                                                        \
  1985.     } while( z80_ICount > 0 );                                    \
  1986. }
  1987. #else
  1988. #define LDDR LDD; if( _BC ) { _PC -= 2; CY(5); }
  1989. #endif
  1990.  
  1991. /***************************************************************
  1992.  * CPDR
  1993.  ***************************************************************/
  1994. #if REPEAT_AT_ONCE
  1995. #define CPDR {                                                  \
  1996.     CY(5);                                                        \
  1997.     _PC -= 2;                                                    \
  1998.     do                                                          \
  1999.     {                                                            \
  2000.         CPD;                                                    \
  2001.         if( _BC && !(_F & ZF) )                                 \
  2002.         {                                                        \
  2003.             if( z80_ICount > 0 )                                \
  2004.             {                                                   \
  2005.                 _R += 2;  /* increment R twice */                \
  2006.                 CY(21);                                         \
  2007.             }                                                    \
  2008.             else break;                                         \
  2009.         }                                                       \
  2010.         else                                                    \
  2011.         {                                                        \
  2012.             _PC += 2;                                            \
  2013.             z80_ICount += 5;                                    \
  2014.             break;                                              \
  2015.         }                                                        \
  2016.     } while( z80_ICount > 0 );                                    \
  2017. }
  2018. #else
  2019. #define CPDR CPD; if( _BC && !(_F & ZF) ) { _PC -= 2; CY(5); }
  2020. #endif
  2021.  
  2022. /***************************************************************
  2023.  * INDR
  2024.  ***************************************************************/
  2025. #if REPEAT_AT_ONCE
  2026. #define INDR {                                                  \
  2027.     CY(5);                                                        \
  2028.     _PC -= 2;                                                    \
  2029.     do                                                          \
  2030.     {                                                            \
  2031.         IND;                                                    \
  2032.         if( _B )                                                \
  2033.         {                                                        \
  2034.             if( z80_ICount > 0 )                                \
  2035.             {                                                   \
  2036.                 _R += 2;  /* increment R twice */                \
  2037.                 CY(21);                                         \
  2038.             }                                                    \
  2039.             else break;                                         \
  2040.         }                                                       \
  2041.         else                                                    \
  2042.         {                                                        \
  2043.             _PC += 2;                                            \
  2044.             z80_ICount += 5;                                    \
  2045.             break;                                              \
  2046.         }                                                        \
  2047.     } while( z80_ICount > 0 );                                    \
  2048. }
  2049. #else
  2050. #define INDR IND; if( _B ) { _PC -= 2; CY(5); }
  2051. #endif
  2052.  
  2053. /***************************************************************
  2054.  * OTDR
  2055.  ***************************************************************/
  2056. #if REPEAT_AT_ONCE
  2057. #define OTDR {                                                  \
  2058.     CY(5);                                                        \
  2059.     _PC -= 2;                                                    \
  2060.     do                                                          \
  2061.     {                                                            \
  2062.         OUTD;                                                    \
  2063.         if( _B )                                                \
  2064.         {                                                        \
  2065.             if( z80_ICount > 0 )                                \
  2066.             {                                                   \
  2067.                 _R += 2;  /* increment R twice */                \
  2068.                 CY(21);                                         \
  2069.             }                                                    \
  2070.             else break;                                         \
  2071.         }                                                       \
  2072.         else                                                    \
  2073.         {                                                        \
  2074.             _PC += 2;                                            \
  2075.             z80_ICount += 5;                                    \
  2076.             break;                                              \
  2077.         }                                                        \
  2078.     } while( z80_ICount > 0 );                                    \
  2079. }
  2080. #else
  2081. #define OTDR OUTD; if( _B ) { _PC -= 2; CY(5); }
  2082. #endif
  2083.  
  2084. /***************************************************************
  2085.  * EI
  2086.  ***************************************************************/
  2087. #define EI {                                                    \
  2088.     /* If interrupts were disabled, execute one more            \
  2089.      * instruction and check the IRQ line.                      \
  2090.      * If not, simply set interrupt flip-flop 2                 \
  2091.      */                                                         \
  2092.     if( _IFF1 == 0 )                                            \
  2093.     {                                                            \
  2094.         _IFF1 = _IFF2 = 1;                                      \
  2095.         _PPC = _PCD;                                            \
  2096.         CALL_MAME_DEBUG;                                        \
  2097.         _R++;                                                    \
  2098.         if( Z80.irq_state != CLEAR_LINE ||                        \
  2099.             Z80.request_irq >= 0 )                                \
  2100.         {                                                        \
  2101.             after_EI = 1;    /* avoid cycle skip hacks */        \
  2102.             EXEC(op,ROP());                                     \
  2103.             after_EI = 0;                                        \
  2104.             LOG(("Z80#%d EI takes irq\n", cpu_getactivecpu())); \
  2105.             take_interrupt();                                   \
  2106.         }                                                       \
  2107.         else EXEC(op,ROP());                                     \
  2108.     } else _IFF2 = 1;                                           \
  2109. }
  2110.  
  2111. /**********************************************************
  2112.  * opcodes with CB prefix
  2113.  * rotate, shift and bit operations
  2114.  **********************************************************/
  2115. OP(cb,00) { _B = RLC(_B);                                            } /* RLC  B           */
  2116. OP(cb,01) { _C = RLC(_C);                                            } /* RLC  C           */
  2117. OP(cb,02) { _D = RLC(_D);                                            } /* RLC  D           */
  2118. OP(cb,03) { _E = RLC(_E);                                            } /* RLC  E           */
  2119. OP(cb,04) { _H = RLC(_H);                                            } /* RLC  H           */
  2120. OP(cb,05) { _L = RLC(_L);                                            } /* RLC  L           */
  2121. OP(cb,06) { WM( _HL, RLC(RM(_HL)) );                                } /* RLC  (HL)          */
  2122. OP(cb,07) { _A = RLC(_A);                                            } /* RLC  A           */
  2123.  
  2124. OP(cb,08) { _B = RRC(_B);                                            } /* RRC  B           */
  2125. OP(cb,09) { _C = RRC(_C);                                            } /* RRC  C           */
  2126. OP(cb,0a) { _D = RRC(_D);                                            } /* RRC  D           */
  2127. OP(cb,0b) { _E = RRC(_E);                                            } /* RRC  E           */
  2128. OP(cb,0c) { _H = RRC(_H);                                            } /* RRC  H           */
  2129. OP(cb,0d) { _L = RRC(_L);                                            } /* RRC  L           */
  2130. OP(cb,0e) { WM( _HL, RRC(RM(_HL)) );                                } /* RRC  (HL)          */
  2131. OP(cb,0f) { _A = RRC(_A);                                            } /* RRC  A           */
  2132.  
  2133. OP(cb,10) { _B = RL(_B);                                            } /* RL   B           */
  2134. OP(cb,11) { _C = RL(_C);                                            } /* RL   C           */
  2135. OP(cb,12) { _D = RL(_D);                                            } /* RL   D           */
  2136. OP(cb,13) { _E = RL(_E);                                            } /* RL   E           */
  2137. OP(cb,14) { _H = RL(_H);                                            } /* RL   H           */
  2138. OP(cb,15) { _L = RL(_L);                                            } /* RL   L           */
  2139. OP(cb,16) { WM( _HL, RL(RM(_HL)) );                                 } /* RL   (HL)          */
  2140. OP(cb,17) { _A = RL(_A);                                            } /* RL   A           */
  2141.  
  2142. OP(cb,18) { _B = RR(_B);                                            } /* RR   B           */
  2143. OP(cb,19) { _C = RR(_C);                                            } /* RR   C           */
  2144. OP(cb,1a) { _D = RR(_D);                                            } /* RR   D           */
  2145. OP(cb,1b) { _E = RR(_E);                                            } /* RR   E           */
  2146. OP(cb,1c) { _H = RR(_H);                                            } /* RR   H           */
  2147. OP(cb,1d) { _L = RR(_L);                                            } /* RR   L           */
  2148. OP(cb,1e) { WM( _HL, RR(RM(_HL)) );                                 } /* RR   (HL)          */
  2149. OP(cb,1f) { _A = RR(_A);                                            } /* RR   A           */
  2150.  
  2151. OP(cb,20) { _B = SLA(_B);                                            } /* SLA  B           */
  2152. OP(cb,21) { _C = SLA(_C);                                            } /* SLA  C           */
  2153. OP(cb,22) { _D = SLA(_D);                                            } /* SLA  D           */
  2154. OP(cb,23) { _E = SLA(_E);                                            } /* SLA  E           */
  2155. OP(cb,24) { _H = SLA(_H);                                            } /* SLA  H           */
  2156. OP(cb,25) { _L = SLA(_L);                                            } /* SLA  L           */
  2157. OP(cb,26) { WM( _HL, SLA(RM(_HL)) );                                } /* SLA  (HL)          */
  2158. OP(cb,27) { _A = SLA(_A);                                            } /* SLA  A           */
  2159.  
  2160. OP(cb,28) { _B = SRA(_B);                                            } /* SRA  B           */
  2161. OP(cb,29) { _C = SRA(_C);                                            } /* SRA  C           */
  2162. OP(cb,2a) { _D = SRA(_D);                                            } /* SRA  D           */
  2163. OP(cb,2b) { _E = SRA(_E);                                            } /* SRA  E           */
  2164. OP(cb,2c) { _H = SRA(_H);                                            } /* SRA  H           */
  2165. OP(cb,2d) { _L = SRA(_L);                                            } /* SRA  L           */
  2166. OP(cb,2e) { WM( _HL, SRA(RM(_HL)) );                                } /* SRA  (HL)          */
  2167. OP(cb,2f) { _A = SRA(_A);                                            } /* SRA  A           */
  2168.  
  2169. OP(cb,30) { _B = SLL(_B);                                            } /* SLL  B           */
  2170. OP(cb,31) { _C = SLL(_C);                                            } /* SLL  C           */
  2171. OP(cb,32) { _D = SLL(_D);                                            } /* SLL  D           */
  2172. OP(cb,33) { _E = SLL(_E);                                            } /* SLL  E           */
  2173. OP(cb,34) { _H = SLL(_H);                                            } /* SLL  H           */
  2174. OP(cb,35) { _L = SLL(_L);                                            } /* SLL  L           */
  2175. OP(cb,36) { WM( _HL, SLL(RM(_HL)) );                                } /* SLL  (HL)          */
  2176. OP(cb,37) { _A = SLL(_A);                                            } /* SLL  A           */
  2177.  
  2178. OP(cb,38) { _B = SRL(_B);                                            } /* SRL  B           */
  2179. OP(cb,39) { _C = SRL(_C);                                            } /* SRL  C           */
  2180. OP(cb,3a) { _D = SRL(_D);                                            } /* SRL  D           */
  2181. OP(cb,3b) { _E = SRL(_E);                                            } /* SRL  E           */
  2182. OP(cb,3c) { _H = SRL(_H);                                            } /* SRL  H           */
  2183. OP(cb,3d) { _L = SRL(_L);                                            } /* SRL  L           */
  2184. OP(cb,3e) { WM( _HL, SRL(RM(_HL)) );                                } /* SRL  (HL)          */
  2185. OP(cb,3f) { _A = SRL(_A);                                            } /* SRL  A           */
  2186.  
  2187. OP(cb,40) { BIT(0,_B);                                                } /* BIT  0,B          */
  2188. OP(cb,41) { BIT(0,_C);                                                } /* BIT  0,C          */
  2189. OP(cb,42) { BIT(0,_D);                                                } /* BIT  0,D          */
  2190. OP(cb,43) { BIT(0,_E);                                                } /* BIT  0,E          */
  2191. OP(cb,44) { BIT(0,_H);                                                } /* BIT  0,H          */
  2192. OP(cb,45) { BIT(0,_L);                                                } /* BIT  0,L          */
  2193. OP(cb,46) { BIT(0,RM(_HL));                                         } /* BIT  0,(HL)      */
  2194. OP(cb,47) { BIT(0,_A);                                                } /* BIT  0,A          */
  2195.  
  2196. OP(cb,48) { BIT(1,_B);                                                } /* BIT  1,B          */
  2197. OP(cb,49) { BIT(1,_C);                                                } /* BIT  1,C          */
  2198. OP(cb,4a) { BIT(1,_D);                                                } /* BIT  1,D          */
  2199. OP(cb,4b) { BIT(1,_E);                                                } /* BIT  1,E          */
  2200. OP(cb,4c) { BIT(1,_H);                                                } /* BIT  1,H          */
  2201. OP(cb,4d) { BIT(1,_L);                                                } /* BIT  1,L          */
  2202. OP(cb,4e) { BIT(1,RM(_HL));                                         } /* BIT  1,(HL)      */
  2203. OP(cb,4f) { BIT(1,_A);                                                } /* BIT  1,A          */
  2204.  
  2205. OP(cb,50) { BIT(2,_B);                                                } /* BIT  2,B          */
  2206. OP(cb,51) { BIT(2,_C);                                                } /* BIT  2,C          */
  2207. OP(cb,52) { BIT(2,_D);                                                } /* BIT  2,D          */
  2208. OP(cb,53) { BIT(2,_E);                                                } /* BIT  2,E          */
  2209. OP(cb,54) { BIT(2,_H);                                                } /* BIT  2,H          */
  2210. OP(cb,55) { BIT(2,_L);                                                } /* BIT  2,L          */
  2211. OP(cb,56) { BIT(2,RM(_HL));                                         } /* BIT  2,(HL)      */
  2212. OP(cb,57) { BIT(2,_A);                                                } /* BIT  2,A          */
  2213.  
  2214. OP(cb,58) { BIT(3,_B);                                                } /* BIT  3,B          */
  2215. OP(cb,59) { BIT(3,_C);                                                } /* BIT  3,C          */
  2216. OP(cb,5a) { BIT(3,_D);                                                } /* BIT  3,D          */
  2217. OP(cb,5b) { BIT(3,_E);                                                } /* BIT  3,E          */
  2218. OP(cb,5c) { BIT(3,_H);                                                } /* BIT  3,H          */
  2219. OP(cb,5d) { BIT(3,_L);                                                } /* BIT  3,L          */
  2220. OP(cb,5e) { BIT(3,RM(_HL));                                         } /* BIT  3,(HL)      */
  2221. OP(cb,5f) { BIT(3,_A);                                                } /* BIT  3,A          */
  2222.  
  2223. OP(cb,60) { BIT(4,_B);                                                } /* BIT  4,B          */
  2224. OP(cb,61) { BIT(4,_C);                                                } /* BIT  4,C          */
  2225. OP(cb,62) { BIT(4,_D);                                                } /* BIT  4,D          */
  2226. OP(cb,63) { BIT(4,_E);                                                } /* BIT  4,E          */
  2227. OP(cb,64) { BIT(4,_H);                                                } /* BIT  4,H          */
  2228. OP(cb,65) { BIT(4,_L);                                                } /* BIT  4,L          */
  2229. OP(cb,66) { BIT(4,RM(_HL));                                         } /* BIT  4,(HL)      */
  2230. OP(cb,67) { BIT(4,_A);                                                } /* BIT  4,A          */
  2231.  
  2232. OP(cb,68) { BIT(5,_B);                                                } /* BIT  5,B          */
  2233. OP(cb,69) { BIT(5,_C);                                                } /* BIT  5,C          */
  2234. OP(cb,6a) { BIT(5,_D);                                                } /* BIT  5,D          */
  2235. OP(cb,6b) { BIT(5,_E);                                                } /* BIT  5,E          */
  2236. OP(cb,6c) { BIT(5,_H);                                                } /* BIT  5,H          */
  2237. OP(cb,6d) { BIT(5,_L);                                                } /* BIT  5,L          */
  2238. OP(cb,6e) { BIT(5,RM(_HL));                                         } /* BIT  5,(HL)      */
  2239. OP(cb,6f) { BIT(5,_A);                                                } /* BIT  5,A          */
  2240.  
  2241. OP(cb,70) { BIT(6,_B);                                                } /* BIT  6,B          */
  2242. OP(cb,71) { BIT(6,_C);                                                } /* BIT  6,C          */
  2243. OP(cb,72) { BIT(6,_D);                                                } /* BIT  6,D          */
  2244. OP(cb,73) { BIT(6,_E);                                                } /* BIT  6,E          */
  2245. OP(cb,74) { BIT(6,_H);                                                } /* BIT  6,H          */
  2246. OP(cb,75) { BIT(6,_L);                                                } /* BIT  6,L          */
  2247. OP(cb,76) { BIT(6,RM(_HL));                                         } /* BIT  6,(HL)      */
  2248. OP(cb,77) { BIT(6,_A);                                                } /* BIT  6,A          */
  2249.  
  2250. OP(cb,78) { BIT(7,_B);                                                } /* BIT  7,B          */
  2251. OP(cb,79) { BIT(7,_C);                                                } /* BIT  7,C          */
  2252. OP(cb,7a) { BIT(7,_D);                                                } /* BIT  7,D          */
  2253. OP(cb,7b) { BIT(7,_E);                                                } /* BIT  7,E          */
  2254. OP(cb,7c) { BIT(7,_H);                                                } /* BIT  7,H          */
  2255. OP(cb,7d) { BIT(7,_L);                                                } /* BIT  7,L          */
  2256. OP(cb,7e) { BIT(7,RM(_HL));                                         } /* BIT  7,(HL)      */
  2257. OP(cb,7f) { BIT(7,_A);                                                } /* BIT  7,A          */
  2258.  
  2259. OP(cb,80) { _B = RES(0,_B);                                         } /* RES  0,B          */
  2260. OP(cb,81) { _C = RES(0,_C);                                         } /* RES  0,C          */
  2261. OP(cb,82) { _D = RES(0,_D);                                         } /* RES  0,D          */
  2262. OP(cb,83) { _E = RES(0,_E);                                         } /* RES  0,E          */
  2263. OP(cb,84) { _H = RES(0,_H);                                         } /* RES  0,H          */
  2264. OP(cb,85) { _L = RES(0,_L);                                         } /* RES  0,L          */
  2265. OP(cb,86) { WM( _HL, RES(0,RM(_HL)) );                                } /* RES  0,(HL)      */
  2266. OP(cb,87) { _A = RES(0,_A);                                         } /* RES  0,A          */
  2267.  
  2268. OP(cb,88) { _B = RES(1,_B);                                         } /* RES  1,B          */
  2269. OP(cb,89) { _C = RES(1,_C);                                         } /* RES  1,C          */
  2270. OP(cb,8a) { _D = RES(1,_D);                                         } /* RES  1,D          */
  2271. OP(cb,8b) { _E = RES(1,_E);                                         } /* RES  1,E          */
  2272. OP(cb,8c) { _H = RES(1,_H);                                         } /* RES  1,H          */
  2273. OP(cb,8d) { _L = RES(1,_L);                                         } /* RES  1,L          */
  2274. OP(cb,8e) { WM( _HL, RES(1,RM(_HL)) );                                } /* RES  1,(HL)      */
  2275. OP(cb,8f) { _A = RES(1,_A);                                         } /* RES  1,A          */
  2276.  
  2277. OP(cb,90) { _B = RES(2,_B);                                         } /* RES  2,B          */
  2278. OP(cb,91) { _C = RES(2,_C);                                         } /* RES  2,C          */
  2279. OP(cb,92) { _D = RES(2,_D);                                         } /* RES  2,D          */
  2280. OP(cb,93) { _E = RES(2,_E);                                         } /* RES  2,E          */
  2281. OP(cb,94) { _H = RES(2,_H);                                         } /* RES  2,H          */
  2282. OP(cb,95) { _L = RES(2,_L);                                         } /* RES  2,L          */
  2283. OP(cb,96) { WM( _HL, RES(2,RM(_HL)) );                                } /* RES  2,(HL)      */
  2284. OP(cb,97) { _A = RES(2,_A);                                         } /* RES  2,A          */
  2285.  
  2286. OP(cb,98) { _B = RES(3,_B);                                         } /* RES  3,B          */
  2287. OP(cb,99) { _C = RES(3,_C);                                         } /* RES  3,C          */
  2288. OP(cb,9a) { _D = RES(3,_D);                                         } /* RES  3,D          */
  2289. OP(cb,9b) { _E = RES(3,_E);                                         } /* RES  3,E          */
  2290. OP(cb,9c) { _H = RES(3,_H);                                         } /* RES  3,H          */
  2291. OP(cb,9d) { _L = RES(3,_L);                                         } /* RES  3,L          */
  2292. OP(cb,9e) { WM( _HL, RES(3,RM(_HL)) );                                } /* RES  3,(HL)      */
  2293. OP(cb,9f) { _A = RES(3,_A);                                         } /* RES  3,A          */
  2294.  
  2295. OP(cb,a0) { _B = RES(4,_B);                                         } /* RES  4,B          */
  2296. OP(cb,a1) { _C = RES(4,_C);                                         } /* RES  4,C          */
  2297. OP(cb,a2) { _D = RES(4,_D);                                         } /* RES  4,D          */
  2298. OP(cb,a3) { _E = RES(4,_E);                                         } /* RES  4,E          */
  2299. OP(cb,a4) { _H = RES(4,_H);                                         } /* RES  4,H          */
  2300. OP(cb,a5) { _L = RES(4,_L);                                         } /* RES  4,L          */
  2301. OP(cb,a6) { WM( _HL, RES(4,RM(_HL)) );                                } /* RES  4,(HL)      */
  2302. OP(cb,a7) { _A = RES(4,_A);                                         } /* RES  4,A          */
  2303.  
  2304. OP(cb,a8) { _B = RES(5,_B);                                         } /* RES  5,B          */
  2305. OP(cb,a9) { _C = RES(5,_C);                                         } /* RES  5,C          */
  2306. OP(cb,aa) { _D = RES(5,_D);                                         } /* RES  5,D          */
  2307. OP(cb,ab) { _E = RES(5,_E);                                         } /* RES  5,E          */
  2308. OP(cb,ac) { _H = RES(5,_H);                                         } /* RES  5,H          */
  2309. OP(cb,ad) { _L = RES(5,_L);                                         } /* RES  5,L          */
  2310. OP(cb,ae) { WM( _HL, RES(5,RM(_HL)) );                                } /* RES  5,(HL)      */
  2311. OP(cb,af) { _A = RES(5,_A);                                         } /* RES  5,A          */
  2312.  
  2313. OP(cb,b0) { _B = RES(6,_B);                                         } /* RES  6,B          */
  2314. OP(cb,b1) { _C = RES(6,_C);                                         } /* RES  6,C          */
  2315. OP(cb,b2) { _D = RES(6,_D);                                         } /* RES  6,D          */
  2316. OP(cb,b3) { _E = RES(6,_E);                                         } /* RES  6,E          */
  2317. OP(cb,b4) { _H = RES(6,_H);                                         } /* RES  6,H          */
  2318. OP(cb,b5) { _L = RES(6,_L);                                         } /* RES  6,L          */
  2319. OP(cb,b6) { WM( _HL, RES(6,RM(_HL)) );                                } /* RES  6,(HL)      */
  2320. OP(cb,b7) { _A = RES(6,_A);                                         } /* RES  6,A          */
  2321.  
  2322. OP(cb,b8) { _B = RES(7,_B);                                         } /* RES  7,B          */
  2323. OP(cb,b9) { _C = RES(7,_C);                                         } /* RES  7,C          */
  2324. OP(cb,ba) { _D = RES(7,_D);                                         } /* RES  7,D          */
  2325. OP(cb,bb) { _E = RES(7,_E);                                         } /* RES  7,E          */
  2326. OP(cb,bc) { _H = RES(7,_H);                                         } /* RES  7,H          */
  2327. OP(cb,bd) { _L = RES(7,_L);                                         } /* RES  7,L          */
  2328. OP(cb,be) { WM( _HL, RES(7,RM(_HL)) );                                } /* RES  7,(HL)      */
  2329. OP(cb,bf) { _A = RES(7,_A);                                         } /* RES  7,A          */
  2330.  
  2331. OP(cb,c0) { _B = SET(0,_B);                                         } /* SET  0,B          */
  2332. OP(cb,c1) { _C = SET(0,_C);                                         } /* SET  0,C          */
  2333. OP(cb,c2) { _D = SET(0,_D);                                         } /* SET  0,D          */
  2334. OP(cb,c3) { _E = SET(0,_E);                                         } /* SET  0,E          */
  2335. OP(cb,c4) { _H = SET(0,_H);                                         } /* SET  0,H          */
  2336. OP(cb,c5) { _L = SET(0,_L);                                         } /* SET  0,L          */
  2337. OP(cb,c6) { WM( _HL, SET(0,RM(_HL)) );                                } /* SET  0,(HL)      */
  2338. OP(cb,c7) { _A = SET(0,_A);                                         } /* SET  0,A          */
  2339.  
  2340. OP(cb,c8) { _B = SET(1,_B);                                         } /* SET  1,B          */
  2341. OP(cb,c9) { _C = SET(1,_C);                                         } /* SET  1,C          */
  2342. OP(cb,ca) { _D = SET(1,_D);                                         } /* SET  1,D          */
  2343. OP(cb,cb) { _E = SET(1,_E);                                         } /* SET  1,E          */
  2344. OP(cb,cc) { _H = SET(1,_H);                                         } /* SET  1,H          */
  2345. OP(cb,cd) { _L = SET(1,_L);                                         } /* SET  1,L          */
  2346. OP(cb,ce) { WM( _HL, SET(1,RM(_HL)) );                                } /* SET  1,(HL)      */
  2347. OP(cb,cf) { _A = SET(1,_A);                                         } /* SET  1,A          */
  2348.  
  2349. OP(cb,d0) { _B = SET(2,_B);                                         } /* SET  2,B          */
  2350. OP(cb,d1) { _C = SET(2,_C);                                         } /* SET  2,C          */
  2351. OP(cb,d2) { _D = SET(2,_D);                                         } /* SET  2,D          */
  2352. OP(cb,d3) { _E = SET(2,_E);                                         } /* SET  2,E          */
  2353. OP(cb,d4) { _H = SET(2,_H);                                         } /* SET  2,H          */
  2354. OP(cb,d5) { _L = SET(2,_L);                                         } /* SET  2,L          */
  2355. OP(cb,d6) { WM( _HL, SET(2,RM(_HL)) );                                }/* SET  2,(HL)      */
  2356. OP(cb,d7) { _A = SET(2,_A);                                         } /* SET  2,A          */
  2357.  
  2358. OP(cb,d8) { _B = SET(3,_B);                                         } /* SET  3,B          */
  2359. OP(cb,d9) { _C = SET(3,_C);                                         } /* SET  3,C          */
  2360. OP(cb,da) { _D = SET(3,_D);                                         } /* SET  3,D          */
  2361. OP(cb,db) { _E = SET(3,_E);                                         } /* SET  3,E          */
  2362. OP(cb,dc) { _H = SET(3,_H);                                         } /* SET  3,H          */
  2363. OP(cb,dd) { _L = SET(3,_L);                                         } /* SET  3,L          */
  2364. OP(cb,de) { WM( _HL, SET(3,RM(_HL)) );                                } /* SET  3,(HL)      */
  2365. OP(cb,df) { _A = SET(3,_A);                                         } /* SET  3,A          */
  2366.  
  2367. OP(cb,e0) { _B = SET(4,_B);                                         } /* SET  4,B          */
  2368. OP(cb,e1) { _C = SET(4,_C);                                         } /* SET  4,C          */
  2369. OP(cb,e2) { _D = SET(4,_D);                                         } /* SET  4,D          */
  2370. OP(cb,e3) { _E = SET(4,_E);                                         } /* SET  4,E          */
  2371. OP(cb,e4) { _H = SET(4,_H);                                         } /* SET  4,H          */
  2372. OP(cb,e5) { _L = SET(4,_L);                                         } /* SET  4,L          */
  2373. OP(cb,e6) { WM( _HL, SET(4,RM(_HL)) );                                } /* SET  4,(HL)      */
  2374. OP(cb,e7) { _A = SET(4,_A);                                         } /* SET  4,A          */
  2375.  
  2376. OP(cb,e8) { _B = SET(5,_B);                                         } /* SET  5,B          */
  2377. OP(cb,e9) { _C = SET(5,_C);                                         } /* SET  5,C          */
  2378. OP(cb,ea) { _D = SET(5,_D);                                         } /* SET  5,D          */
  2379. OP(cb,eb) { _E = SET(5,_E);                                         } /* SET  5,E          */
  2380. OP(cb,ec) { _H = SET(5,_H);                                         } /* SET  5,H          */
  2381. OP(cb,ed) { _L = SET(5,_L);                                         } /* SET  5,L          */
  2382. OP(cb,ee) { WM( _HL, SET(5,RM(_HL)) );                                } /* SET  5,(HL)      */
  2383. OP(cb,ef) { _A = SET(5,_A);                                         } /* SET  5,A          */
  2384.  
  2385. OP(cb,f0) { _B = SET(6,_B);                                         } /* SET  6,B          */
  2386. OP(cb,f1) { _C = SET(6,_C);                                         } /* SET  6,C          */
  2387. OP(cb,f2) { _D = SET(6,_D);                                         } /* SET  6,D          */
  2388. OP(cb,f3) { _E = SET(6,_E);                                         } /* SET  6,E          */
  2389. OP(cb,f4) { _H = SET(6,_H);                                         } /* SET  6,H          */
  2390. OP(cb,f5) { _L = SET(6,_L);                                         } /* SET  6,L          */
  2391. OP(cb,f6) { WM( _HL, SET(6,RM(_HL)) );                                } /* SET  6,(HL)      */
  2392. OP(cb,f7) { _A = SET(6,_A);                                         } /* SET  6,A          */
  2393.  
  2394. OP(cb,f8) { _B = SET(7,_B);                                         } /* SET  7,B          */
  2395. OP(cb,f9) { _C = SET(7,_C);                                         } /* SET  7,C          */
  2396. OP(cb,fa) { _D = SET(7,_D);                                         } /* SET  7,D          */
  2397. OP(cb,fb) { _E = SET(7,_E);                                         } /* SET  7,E          */
  2398. OP(cb,fc) { _H = SET(7,_H);                                         } /* SET  7,H          */
  2399. OP(cb,fd) { _L = SET(7,_L);                                         } /* SET  7,L          */
  2400. OP(cb,fe) { WM( _HL, SET(7,RM(_HL)) );                                } /* SET  7,(HL)      */
  2401. OP(cb,ff) { _A = SET(7,_A);                                         } /* SET  7,A          */
  2402.  
  2403.  
  2404. /**********************************************************
  2405. * opcodes with DD/FD CB prefix
  2406. * rotate, shift and bit operations with (IX+o)
  2407. **********************************************************/
  2408. OP(xxcb,00) { _B = RLC( RM(EA) ); WM( EA,_B );                        } /* RLC  B=(XY+o)      */
  2409. OP(xxcb,01) { _C = RLC( RM(EA) ); WM( EA,_C );                        } /* RLC  C=(XY+o)      */
  2410. OP(xxcb,02) { _D = RLC( RM(EA) ); WM( EA,_D );                        } /* RLC  D=(XY+o)      */
  2411. OP(xxcb,03) { _E = RLC( RM(EA) ); WM( EA,_E );                        } /* RLC  E=(XY+o)      */
  2412. OP(xxcb,04) { _H = RLC( RM(EA) ); WM( EA,_H );                        } /* RLC  H=(XY+o)      */
  2413. OP(xxcb,05) { _L = RLC( RM(EA) ); WM( EA,_L );                        } /* RLC  L=(XY+o)      */
  2414. OP(xxcb,06) { WM( EA, RLC( RM(EA) ) );                                } /* RLC  (XY+o)      */
  2415. OP(xxcb,07) { _A = RLC( RM(EA) ); WM( EA,_A );                        } /* RLC  A=(XY+o)      */
  2416.  
  2417. OP(xxcb,08) { _B = RRC( RM(EA) ); WM( EA,_B );                        } /* RRC  B=(XY+o)      */
  2418. OP(xxcb,09) { _C = RRC( RM(EA) ); WM( EA,_C );                        } /* RRC  C=(XY+o)      */
  2419. OP(xxcb,0a) { _D = RRC( RM(EA) ); WM( EA,_D );                        } /* RRC  D=(XY+o)      */
  2420. OP(xxcb,0b) { _E = RRC( RM(EA) ); WM( EA,_E );                        } /* RRC  E=(XY+o)      */
  2421. OP(xxcb,0c) { _H = RRC( RM(EA) ); WM( EA,_H );                        } /* RRC  H=(XY+o)      */
  2422. OP(xxcb,0d) { _L = RRC( RM(EA) ); WM( EA,_L );                        } /* RRC  L=(XY+o)      */
  2423. OP(xxcb,0e) { WM( EA,RRC( RM(EA) ) );                                } /* RRC  (XY+o)      */
  2424. OP(xxcb,0f) { _A = RRC( RM(EA) ); WM( EA,_A );                        } /* RRC  A=(XY+o)      */
  2425.  
  2426. OP(xxcb,10) { _B = RL( RM(EA) ); WM( EA,_B );                        } /* RL   B=(XY+o)      */
  2427. OP(xxcb,11) { _C = RL( RM(EA) ); WM( EA,_C );                        } /* RL   C=(XY+o)      */
  2428. OP(xxcb,12) { _D = RL( RM(EA) ); WM( EA,_D );                        } /* RL   D=(XY+o)      */
  2429. OP(xxcb,13) { _E = RL( RM(EA) ); WM( EA,_E );                        } /* RL   E=(XY+o)      */
  2430. OP(xxcb,14) { _H = RL( RM(EA) ); WM( EA,_H );                        } /* RL   H=(XY+o)      */
  2431. OP(xxcb,15) { _L = RL( RM(EA) ); WM( EA,_L );                        } /* RL   L=(XY+o)      */
  2432. OP(xxcb,16) { WM( EA,RL( RM(EA) ) );                                } /* RL   (XY+o)      */
  2433. OP(xxcb,17) { _A = RL( RM(EA) ); WM( EA,_A );                        } /* RL   A=(XY+o)      */
  2434.  
  2435. OP(xxcb,18) { _B = RR( RM(EA) ); WM( EA,_B );                        } /* RR   B=(XY+o)      */
  2436. OP(xxcb,19) { _C = RR( RM(EA) ); WM( EA,_C );                        } /* RR   C=(XY+o)      */
  2437. OP(xxcb,1a) { _D = RR( RM(EA) ); WM( EA,_D );                        } /* RR   D=(XY+o)      */
  2438. OP(xxcb,1b) { _E = RR( RM(EA) ); WM( EA,_E );                        } /* RR   E=(XY+o)      */
  2439. OP(xxcb,1c) { _H = RR( RM(EA) ); WM( EA,_H );                        } /* RR   H=(XY+o)      */
  2440. OP(xxcb,1d) { _L = RR( RM(EA) ); WM( EA,_L );                        } /* RR   L=(XY+o)      */
  2441. OP(xxcb,1e) { WM( EA,RR( RM(EA) ) );                                } /* RR   (XY+o)      */
  2442. OP(xxcb,1f) { _A = RR( RM(EA) ); WM( EA,_A );                        } /* RR   A=(XY+o)      */
  2443.  
  2444. OP(xxcb,20) { _B = SLA( RM(EA) ); WM( EA,_B );                        } /* SLA  B=(XY+o)      */
  2445. OP(xxcb,21) { _C = SLA( RM(EA) ); WM( EA,_C );                        } /* SLA  C=(XY+o)      */
  2446. OP(xxcb,22) { _D = SLA( RM(EA) ); WM( EA,_D );                        } /* SLA  D=(XY+o)      */
  2447. OP(xxcb,23) { _E = SLA( RM(EA) ); WM( EA,_E );                        } /* SLA  E=(XY+o)      */
  2448. OP(xxcb,24) { _H = SLA( RM(EA) ); WM( EA,_H );                        } /* SLA  H=(XY+o)      */
  2449. OP(xxcb,25) { _L = SLA( RM(EA) ); WM( EA,_L );                        } /* SLA  L=(XY+o)      */
  2450. OP(xxcb,26) { WM( EA,SLA( RM(EA) ) );                                } /* SLA  (XY+o)      */
  2451. OP(xxcb,27) { _A = SLA( RM(EA) ); WM( EA,_A );                        } /* SLA  A=(XY+o)      */
  2452.  
  2453. OP(xxcb,28) { _B = SRA( RM(EA) ); WM( EA,_B );                        } /* SRA  B=(XY+o)      */
  2454. OP(xxcb,29) { _C = SRA( RM(EA) ); WM( EA,_C );                        } /* SRA  C=(XY+o)      */
  2455. OP(xxcb,2a) { _D = SRA( RM(EA) ); WM( EA,_D );                        } /* SRA  D=(XY+o)      */
  2456. OP(xxcb,2b) { _E = SRA( RM(EA) ); WM( EA,_E );                        } /* SRA  E=(XY+o)      */
  2457. OP(xxcb,2c) { _H = SRA( RM(EA) ); WM( EA,_H );                        } /* SRA  H=(XY+o)      */
  2458. OP(xxcb,2d) { _L = SRA( RM(EA) ); WM( EA,_L );                        } /* SRA  L=(XY+o)      */
  2459. OP(xxcb,2e) { WM( EA,SRA( RM(EA) ) );                                } /* SRA  (XY+o)      */
  2460. OP(xxcb,2f) { _A = SRA( RM(EA) ); WM( EA,_A );                        } /* SRA  A=(XY+o)      */
  2461.  
  2462. OP(xxcb,30) { _B = SLL( RM(EA) ); WM( EA,_B );                        } /* SLL  B=(XY+o)      */
  2463. OP(xxcb,31) { _C = SLL( RM(EA) ); WM( EA,_C );                        } /* SLL  C=(XY+o)      */
  2464. OP(xxcb,32) { _D = SLL( RM(EA) ); WM( EA,_D );                        } /* SLL  D=(XY+o)      */
  2465. OP(xxcb,33) { _E = SLL( RM(EA) ); WM( EA,_E );                        } /* SLL  E=(XY+o)      */
  2466. OP(xxcb,34) { _H = SLL( RM(EA) ); WM( EA,_H );                        } /* SLL  H=(XY+o)      */
  2467. OP(xxcb,35) { _L = SLL( RM(EA) ); WM( EA,_L );                        } /* SLL  L=(XY+o)      */
  2468. OP(xxcb,36) { WM( EA,SLL( RM(EA) ) );                                } /* SLL  (XY+o)      */
  2469. OP(xxcb,37) { _A = SLL( RM(EA) ); WM( EA,_A );                        } /* SLL  A=(XY+o)      */
  2470.  
  2471. OP(xxcb,38) { _B = SRL( RM(EA) ); WM( EA,_B );                        } /* SRL  B=(XY+o)      */
  2472. OP(xxcb,39) { _C = SRL( RM(EA) ); WM( EA,_C );                        } /* SRL  C=(XY+o)      */
  2473. OP(xxcb,3a) { _D = SRL( RM(EA) ); WM( EA,_D );                        } /* SRL  D=(XY+o)      */
  2474. OP(xxcb,3b) { _E = SRL( RM(EA) ); WM( EA,_E );                        } /* SRL  E=(XY+o)      */
  2475. OP(xxcb,3c) { _H = SRL( RM(EA) ); WM( EA,_H );                        } /* SRL  H=(XY+o)      */
  2476. OP(xxcb,3d) { _L = SRL( RM(EA) ); WM( EA,_L );                        } /* SRL  L=(XY+o)      */
  2477. OP(xxcb,3e) { WM( EA,SRL( RM(EA) ) );                                } /* SRL  (XY+o)      */
  2478. OP(xxcb,3f) { _A = SRL( RM(EA) ); WM( EA,_A );                        } /* SRL  A=(XY+o)      */
  2479.  
  2480. OP(xxcb,40) { xxcb_46();                                            } /* BIT  0,B=(XY+o)  */
  2481. OP(xxcb,41) { xxcb_46();                                                      } /* BIT    0,C=(XY+o)    */
  2482. OP(xxcb,42) { xxcb_46();                                            } /* BIT  0,D=(XY+o)  */
  2483. OP(xxcb,43) { xxcb_46();                                            } /* BIT  0,E=(XY+o)  */
  2484. OP(xxcb,44) { xxcb_46();                                            } /* BIT  0,H=(XY+o)  */
  2485. OP(xxcb,45) { xxcb_46();                                            } /* BIT  0,L=(XY+o)  */
  2486. OP(xxcb,46) { BIT_XY(0,RM(EA));                                     } /* BIT  0,(XY+o)      */
  2487. OP(xxcb,47) { xxcb_46();                                            } /* BIT  0,A=(XY+o)  */
  2488.  
  2489. OP(xxcb,48) { xxcb_4e();                                            } /* BIT  1,B=(XY+o)  */
  2490. OP(xxcb,49) { xxcb_4e();                                                      } /* BIT    1,C=(XY+o)    */
  2491. OP(xxcb,4a) { xxcb_4e();                                            } /* BIT  1,D=(XY+o)  */
  2492. OP(xxcb,4b) { xxcb_4e();                                            } /* BIT  1,E=(XY+o)  */
  2493. OP(xxcb,4c) { xxcb_4e();                                            } /* BIT  1,H=(XY+o)  */
  2494. OP(xxcb,4d) { xxcb_4e();                                            } /* BIT  1,L=(XY+o)  */
  2495. OP(xxcb,4e) { BIT_XY(1,RM(EA));                                     } /* BIT  1,(XY+o)      */
  2496. OP(xxcb,4f) { xxcb_4e();                                            } /* BIT  1,A=(XY+o)  */
  2497.  
  2498. OP(xxcb,50) { xxcb_56();                                            } /* BIT  2,B=(XY+o)  */
  2499. OP(xxcb,51) { xxcb_56();                                                      } /* BIT    2,C=(XY+o)    */
  2500. OP(xxcb,52) { xxcb_56();                                            } /* BIT  2,D=(XY+o)  */
  2501. OP(xxcb,53) { xxcb_56();                                            } /* BIT  2,E=(XY+o)  */
  2502. OP(xxcb,54) { xxcb_56();                                            } /* BIT  2,H=(XY+o)  */
  2503. OP(xxcb,55) { xxcb_56();                                            } /* BIT  2,L=(XY+o)  */
  2504. OP(xxcb,56) { BIT_XY(2,RM(EA));                                     } /* BIT  2,(XY+o)      */
  2505. OP(xxcb,57) { xxcb_56();                                            } /* BIT  2,A=(XY+o)  */
  2506.  
  2507. OP(xxcb,58) { xxcb_5e();                                            } /* BIT  3,B=(XY+o)  */
  2508. OP(xxcb,59) { xxcb_5e();                                                      } /* BIT    3,C=(XY+o)    */
  2509. OP(xxcb,5a) { xxcb_5e();                                            } /* BIT  3,D=(XY+o)  */
  2510. OP(xxcb,5b) { xxcb_5e();                                            } /* BIT  3,E=(XY+o)  */
  2511. OP(xxcb,5c) { xxcb_5e();                                            } /* BIT  3,H=(XY+o)  */
  2512. OP(xxcb,5d) { xxcb_5e();                                            } /* BIT  3,L=(XY+o)  */
  2513. OP(xxcb,5e) { BIT_XY(3,RM(EA));                                     } /* BIT  3,(XY+o)      */
  2514. OP(xxcb,5f) { xxcb_5e();                                            } /* BIT  3,A=(XY+o)  */
  2515.  
  2516. OP(xxcb,60) { xxcb_66();                                            } /* BIT  4,B=(XY+o)  */
  2517. OP(xxcb,61) { xxcb_66();                                                      } /* BIT    4,C=(XY+o)    */
  2518. OP(xxcb,62) { xxcb_66();                                            } /* BIT  4,D=(XY+o)  */
  2519. OP(xxcb,63) { xxcb_66();                                            } /* BIT  4,E=(XY+o)  */
  2520. OP(xxcb,64) { xxcb_66();                                            } /* BIT  4,H=(XY+o)  */
  2521. OP(xxcb,65) { xxcb_66();                                            } /* BIT  4,L=(XY+o)  */
  2522. OP(xxcb,66) { BIT_XY(4,RM(EA));                                     } /* BIT  4,(XY+o)      */
  2523. OP(xxcb,67) { xxcb_66();                                            } /* BIT  4,A=(XY+o)  */
  2524.  
  2525. OP(xxcb,68) { xxcb_6e();                                            } /* BIT  5,B=(XY+o)  */
  2526. OP(xxcb,69) { xxcb_6e();                                                      } /* BIT    5,C=(XY+o)    */
  2527. OP(xxcb,6a) { xxcb_6e();                                            } /* BIT  5,D=(XY+o)  */
  2528. OP(xxcb,6b) { xxcb_6e();                                            } /* BIT  5,E=(XY+o)  */
  2529. OP(xxcb,6c) { xxcb_6e();                                            } /* BIT  5,H=(XY+o)  */
  2530. OP(xxcb,6d) { xxcb_6e();                                            } /* BIT  5,L=(XY+o)  */
  2531. OP(xxcb,6e) { BIT_XY(5,RM(EA));                                     } /* BIT  5,(XY+o)      */
  2532. OP(xxcb,6f) { xxcb_6e();                                            } /* BIT  5,A=(XY+o)  */
  2533.  
  2534. OP(xxcb,70) { xxcb_76();                                            } /* BIT  6,B=(XY+o)  */
  2535. OP(xxcb,71) { xxcb_76();                                                      } /* BIT    6,C=(XY+o)    */
  2536. OP(xxcb,72) { xxcb_76();                                            } /* BIT  6,D=(XY+o)  */
  2537. OP(xxcb,73) { xxcb_76();                                            } /* BIT  6,E=(XY+o)  */
  2538. OP(xxcb,74) { xxcb_76();                                            } /* BIT  6,H=(XY+o)  */
  2539. OP(xxcb,75) { xxcb_76();                                            } /* BIT  6,L=(XY+o)  */
  2540. OP(xxcb,76) { BIT_XY(6,RM(EA));                                     } /* BIT  6,(XY+o)      */
  2541. OP(xxcb,77) { xxcb_76();                                            } /* BIT  6,A=(XY+o)  */
  2542.  
  2543. OP(xxcb,78) { xxcb_7e();                                            } /* BIT  7,B=(XY+o)  */
  2544. OP(xxcb,79) { xxcb_7e();                                                      } /* BIT    7,C=(XY+o)    */
  2545. OP(xxcb,7a) { xxcb_7e();                                            } /* BIT  7,D=(XY+o)  */
  2546. OP(xxcb,7b) { xxcb_7e();                                            } /* BIT  7,E=(XY+o)  */
  2547. OP(xxcb,7c) { xxcb_7e();                                            } /* BIT  7,H=(XY+o)  */
  2548. OP(xxcb,7d) { xxcb_7e();                                            } /* BIT  7,L=(XY+o)  */
  2549. OP(xxcb,7e) { BIT_XY(7,RM(EA));                                     } /* BIT  7,(XY+o)      */
  2550. OP(xxcb,7f) { xxcb_7e();                                            } /* BIT  7,A=(XY+o)  */
  2551.  
  2552. OP(xxcb,80) { _B = RES(0, RM(EA) ); WM( EA,_B );                    } /* RES  0,B=(XY+o)  */
  2553. OP(xxcb,81) { _C = RES(0, RM(EA) ); WM( EA,_C );                    } /* RES  0,C=(XY+o)  */
  2554. OP(xxcb,82) { _D = RES(0, RM(EA) ); WM( EA,_D );                    } /* RES  0,D=(XY+o)  */
  2555. OP(xxcb,83) { _E = RES(0, RM(EA) ); WM( EA,_E );                    } /* RES  0,E=(XY+o)  */
  2556. OP(xxcb,84) { _H = RES(0, RM(EA) ); WM( EA,_H );                    } /* RES  0,H=(XY+o)  */
  2557. OP(xxcb,85) { _L = RES(0, RM(EA) ); WM( EA,_L );                    } /* RES  0,L=(XY+o)  */
  2558. OP(xxcb,86) { WM( EA, RES(0,RM(EA)) );                                } /* RES  0,(XY+o)      */
  2559. OP(xxcb,87) { _A = RES(0, RM(EA) ); WM( EA,_A );                    } /* RES  0,A=(XY+o)  */
  2560.  
  2561. OP(xxcb,88) { _B = RES(1, RM(EA) ); WM( EA,_B );                    } /* RES  1,B=(XY+o)  */
  2562. OP(xxcb,89) { _C = RES(1, RM(EA) ); WM( EA,_C );                    } /* RES  1,C=(XY+o)  */
  2563. OP(xxcb,8a) { _D = RES(1, RM(EA) ); WM( EA,_D );                    } /* RES  1,D=(XY+o)  */
  2564. OP(xxcb,8b) { _E = RES(1, RM(EA) ); WM( EA,_E );                    } /* RES  1,E=(XY+o)  */
  2565. OP(xxcb,8c) { _H = RES(1, RM(EA) ); WM( EA,_H );                    } /* RES  1,H=(XY+o)  */
  2566. OP(xxcb,8d) { _L = RES(1, RM(EA) ); WM( EA,_L );                    } /* RES  1,L=(XY+o)  */
  2567. OP(xxcb,8e) { WM( EA, RES(1,RM(EA)) );                                } /* RES  1,(XY+o)      */
  2568. OP(xxcb,8f) { _A = RES(1, RM(EA) ); WM( EA,_A );                    } /* RES  1,A=(XY+o)  */
  2569.  
  2570. OP(xxcb,90) { _B = RES(2, RM(EA) ); WM( EA,_B );                    } /* RES  2,B=(XY+o)  */
  2571. OP(xxcb,91) { _C = RES(2, RM(EA) ); WM( EA,_C );                    } /* RES  2,C=(XY+o)  */
  2572. OP(xxcb,92) { _D = RES(2, RM(EA) ); WM( EA,_D );                    } /* RES  2,D=(XY+o)  */
  2573. OP(xxcb,93) { _E = RES(2, RM(EA) ); WM( EA,_E );                    } /* RES  2,E=(XY+o)  */
  2574. OP(xxcb,94) { _H = RES(2, RM(EA) ); WM( EA,_H );                    } /* RES  2,H=(XY+o)  */
  2575. OP(xxcb,95) { _L = RES(2, RM(EA) ); WM( EA,_L );                    } /* RES  2,L=(XY+o)  */
  2576. OP(xxcb,96) { WM( EA, RES(2,RM(EA)) );                                } /* RES  2,(XY+o)      */
  2577. OP(xxcb,97) { _A = RES(2, RM(EA) ); WM( EA,_A );                    } /* RES  2,A=(XY+o)  */
  2578.  
  2579. OP(xxcb,98) { _B = RES(3, RM(EA) ); WM( EA,_B );                    } /* RES  3,B=(XY+o)  */
  2580. OP(xxcb,99) { _C = RES(3, RM(EA) ); WM( EA,_C );                    } /* RES  3,C=(XY+o)  */
  2581. OP(xxcb,9a) { _D = RES(3, RM(EA) ); WM( EA,_D );                    } /* RES  3,D=(XY+o)  */
  2582. OP(xxcb,9b) { _E = RES(3, RM(EA) ); WM( EA,_E );                    } /* RES  3,E=(XY+o)  */
  2583. OP(xxcb,9c) { _H = RES(3, RM(EA) ); WM( EA,_H );                    } /* RES  3,H=(XY+o)  */
  2584. OP(xxcb,9d) { _L = RES(3, RM(EA) ); WM( EA,_L );                    } /* RES  3,L=(XY+o)  */
  2585. OP(xxcb,9e) { WM( EA, RES(3,RM(EA)) );                                } /* RES  3,(XY+o)      */
  2586. OP(xxcb,9f) { _A = RES(3, RM(EA) ); WM( EA,_A );                    } /* RES  3,A=(XY+o)  */
  2587.  
  2588. OP(xxcb,a0) { _B = RES(4, RM(EA) ); WM( EA,_B );                    } /* RES  4,B=(XY+o)  */
  2589. OP(xxcb,a1) { _C = RES(4, RM(EA) ); WM( EA,_C );                    } /* RES  4,C=(XY+o)  */
  2590. OP(xxcb,a2) { _D = RES(4, RM(EA) ); WM( EA,_D );                    } /* RES  4,D=(XY+o)  */
  2591. OP(xxcb,a3) { _E = RES(4, RM(EA) ); WM( EA,_E );                    } /* RES  4,E=(XY+o)  */
  2592. OP(xxcb,a4) { _H = RES(4, RM(EA) ); WM( EA,_H );                    } /* RES  4,H=(XY+o)  */
  2593. OP(xxcb,a5) { _L = RES(4, RM(EA) ); WM( EA,_L );                    } /* RES  4,L=(XY+o)  */
  2594. OP(xxcb,a6) { WM( EA, RES(4,RM(EA)) );                                } /* RES  4,(XY+o)      */
  2595. OP(xxcb,a7) { _A = RES(4, RM(EA) ); WM( EA,_A );                    } /* RES  4,A=(XY+o)  */
  2596.  
  2597. OP(xxcb,a8) { _B = RES(5, RM(EA) ); WM( EA,_B );                    } /* RES  5,B=(XY+o)  */
  2598. OP(xxcb,a9) { _C = RES(5, RM(EA) ); WM( EA,_C );                    } /* RES  5,C=(XY+o)  */
  2599. OP(xxcb,aa) { _D = RES(5, RM(EA) ); WM( EA,_D );                    } /* RES  5,D=(XY+o)  */
  2600. OP(xxcb,ab) { _E = RES(5, RM(EA) ); WM( EA,_E );                    } /* RES  5,E=(XY+o)  */
  2601. OP(xxcb,ac) { _H = RES(5, RM(EA) ); WM( EA,_H );                    } /* RES  5,H=(XY+o)  */
  2602. OP(xxcb,ad) { _L = RES(5, RM(EA) ); WM( EA,_L );                    } /* RES  5,L=(XY+o)  */
  2603. OP(xxcb,ae) { WM( EA, RES(5,RM(EA)) );                                } /* RES  5,(XY+o)      */
  2604. OP(xxcb,af) { _A = RES(5, RM(EA) ); WM( EA,_A );                    } /* RES  5,A=(XY+o)  */
  2605.  
  2606. OP(xxcb,b0) { _B = RES(6, RM(EA) ); WM( EA,_B );                    } /* RES  6,B=(XY+o)  */
  2607. OP(xxcb,b1) { _C = RES(6, RM(EA) ); WM( EA,_C );                    } /* RES  6,C=(XY+o)  */
  2608. OP(xxcb,b2) { _D = RES(6, RM(EA) ); WM( EA,_D );                    } /* RES  6,D=(XY+o)  */
  2609. OP(xxcb,b3) { _E = RES(6, RM(EA) ); WM( EA,_E );                    } /* RES  6,E=(XY+o)  */
  2610. OP(xxcb,b4) { _H = RES(6, RM(EA) ); WM( EA,_H );                    } /* RES  6,H=(XY+o)  */
  2611. OP(xxcb,b5) { _L = RES(6, RM(EA) ); WM( EA,_L );                    } /* RES  6,L=(XY+o)  */
  2612. OP(xxcb,b6) { WM( EA, RES(6,RM(EA)) );                                } /* RES  6,(XY+o)      */
  2613. OP(xxcb,b7) { _A = RES(6, RM(EA) ); WM( EA,_A );                    } /* RES  6,A=(XY+o)  */
  2614.  
  2615. OP(xxcb,b8) { _B = RES(7, RM(EA) ); WM( EA,_B );                    } /* RES  7,B=(XY+o)  */
  2616. OP(xxcb,b9) { _C = RES(7, RM(EA) ); WM( EA,_C );                    } /* RES  7,C=(XY+o)  */
  2617. OP(xxcb,ba) { _D = RES(7, RM(EA) ); WM( EA,_D );                    } /* RES  7,D=(XY+o)  */
  2618. OP(xxcb,bb) { _E = RES(7, RM(EA) ); WM( EA,_E );                    } /* RES  7,E=(XY+o)  */
  2619. OP(xxcb,bc) { _H = RES(7, RM(EA) ); WM( EA,_H );                    } /* RES  7,H=(XY+o)  */
  2620. OP(xxcb,bd) { _L = RES(7, RM(EA) ); WM( EA,_L );                    } /* RES  7,L=(XY+o)  */
  2621. OP(xxcb,be) { WM( EA, RES(7,RM(EA)) );                                } /* RES  7,(XY+o)      */
  2622. OP(xxcb,bf) { _A = RES(7, RM(EA) ); WM( EA,_A );                    } /* RES  7,A=(XY+o)  */
  2623.  
  2624. OP(xxcb,c0) { _B = SET(0, RM(EA) ); WM( EA,_B );                    } /* SET  0,B=(XY+o)  */
  2625. OP(xxcb,c1) { _C = SET(0, RM(EA) ); WM( EA,_C );                    } /* SET  0,C=(XY+o)  */
  2626. OP(xxcb,c2) { _D = SET(0, RM(EA) ); WM( EA,_D );                    } /* SET  0,D=(XY+o)  */
  2627. OP(xxcb,c3) { _E = SET(0, RM(EA) ); WM( EA,_E );                    } /* SET  0,E=(XY+o)  */
  2628. OP(xxcb,c4) { _H = SET(0, RM(EA) ); WM( EA,_H );                    } /* SET  0,H=(XY+o)  */
  2629. OP(xxcb,c5) { _L = SET(0, RM(EA) ); WM( EA,_L );                    } /* SET  0,L=(XY+o)  */
  2630. OP(xxcb,c6) { WM( EA, SET(0,RM(EA)) );                                } /* SET  0,(XY+o)      */
  2631. OP(xxcb,c7) { _A = SET(0, RM(EA) ); WM( EA,_A );                    } /* SET  0,A=(XY+o)  */
  2632.  
  2633. OP(xxcb,c8) { _B = SET(1, RM(EA) ); WM( EA,_B );                    } /* SET  1,B=(XY+o)  */
  2634. OP(xxcb,c9) { _C = SET(1, RM(EA) ); WM( EA,_C );                    } /* SET  1,C=(XY+o)  */
  2635. OP(xxcb,ca) { _D = SET(1, RM(EA) ); WM( EA,_D );                    } /* SET  1,D=(XY+o)  */
  2636. OP(xxcb,cb) { _E = SET(1, RM(EA) ); WM( EA,_E );                    } /* SET  1,E=(XY+o)  */
  2637. OP(xxcb,cc) { _H = SET(1, RM(EA) ); WM( EA,_H );                    } /* SET  1,H=(XY+o)  */
  2638. OP(xxcb,cd) { _L = SET(1, RM(EA) ); WM( EA,_L );                    } /* SET  1,L=(XY+o)  */
  2639. OP(xxcb,ce) { WM( EA, SET(1,RM(EA)) );                                } /* SET  1,(XY+o)      */
  2640. OP(xxcb,cf) { _A = SET(1, RM(EA) ); WM( EA,_A );                    } /* SET  1,A=(XY+o)  */
  2641.  
  2642. OP(xxcb,d0) { _B = SET(2, RM(EA) ); WM( EA,_B );                    } /* SET  2,B=(XY+o)  */
  2643. OP(xxcb,d1) { _C = SET(2, RM(EA) ); WM( EA,_C );                    } /* SET  2,C=(XY+o)  */
  2644. OP(xxcb,d2) { _D = SET(2, RM(EA) ); WM( EA,_D );                    } /* SET  2,D=(XY+o)  */
  2645. OP(xxcb,d3) { _E = SET(2, RM(EA) ); WM( EA,_E );                    } /* SET  2,E=(XY+o)  */
  2646. OP(xxcb,d4) { _H = SET(2, RM(EA) ); WM( EA,_H );                    } /* SET  2,H=(XY+o)  */
  2647. OP(xxcb,d5) { _L = SET(2, RM(EA) ); WM( EA,_L );                    } /* SET  2,L=(XY+o)  */
  2648. OP(xxcb,d6) { WM( EA, SET(2,RM(EA)) );                                } /* SET  2,(XY+o)      */
  2649. OP(xxcb,d7) { _A = SET(2, RM(EA) ); WM( EA,_A );                    } /* SET  2,A=(XY+o)  */
  2650.  
  2651. OP(xxcb,d8) { _B = SET(3, RM(EA) ); WM( EA,_B );                    } /* SET  3,B=(XY+o)  */
  2652. OP(xxcb,d9) { _C = SET(3, RM(EA) ); WM( EA,_C );                    } /* SET  3,C=(XY+o)  */
  2653. OP(xxcb,da) { _D = SET(3, RM(EA) ); WM( EA,_D );                    } /* SET  3,D=(XY+o)  */
  2654. OP(xxcb,db) { _E = SET(3, RM(EA) ); WM( EA,_E );                    } /* SET  3,E=(XY+o)  */
  2655. OP(xxcb,dc) { _H = SET(3, RM(EA) ); WM( EA,_H );                    } /* SET  3,H=(XY+o)  */
  2656. OP(xxcb,dd) { _L = SET(3, RM(EA) ); WM( EA,_L );                    } /* SET  3,L=(XY+o)  */
  2657. OP(xxcb,de) { WM( EA, SET(3,RM(EA)) );                                } /* SET  3,(XY+o)      */
  2658. OP(xxcb,df) { _A = SET(3, RM(EA) ); WM( EA,_A );                    } /* SET  3,A=(XY+o)  */
  2659.  
  2660. OP(xxcb,e0) { _B = SET(4, RM(EA) ); WM( EA,_B );                    } /* SET  4,B=(XY+o)  */
  2661. OP(xxcb,e1) { _C = SET(4, RM(EA) ); WM( EA,_C );                    } /* SET  4,C=(XY+o)  */
  2662. OP(xxcb,e2) { _D = SET(4, RM(EA) ); WM( EA,_D );                    } /* SET  4,D=(XY+o)  */
  2663. OP(xxcb,e3) { _E = SET(4, RM(EA) ); WM( EA,_E );                    } /* SET  4,E=(XY+o)  */
  2664. OP(xxcb,e4) { _H = SET(4, RM(EA) ); WM( EA,_H );                    } /* SET  4,H=(XY+o)  */
  2665. OP(xxcb,e5) { _L = SET(4, RM(EA) ); WM( EA,_L );                    } /* SET  4,L=(XY+o)  */
  2666. OP(xxcb,e6) { WM( EA, SET(4,RM(EA)) );                                } /* SET  4,(XY+o)      */
  2667. OP(xxcb,e7) { _A = SET(4, RM(EA) ); WM( EA,_A );                    } /* SET  4,A=(XY+o)  */
  2668.  
  2669. OP(xxcb,e8) { _B = SET(5, RM(EA) ); WM( EA,_B );                    } /* SET  5,B=(XY+o)  */
  2670. OP(xxcb,e9) { _C = SET(5, RM(EA) ); WM( EA,_C );                    } /* SET  5,C=(XY+o)  */
  2671. OP(xxcb,ea) { _D = SET(5, RM(EA) ); WM( EA,_D );                    } /* SET  5,D=(XY+o)  */
  2672. OP(xxcb,eb) { _E = SET(5, RM(EA) ); WM( EA,_E );                    } /* SET  5,E=(XY+o)  */
  2673. OP(xxcb,ec) { _H = SET(5, RM(EA) ); WM( EA,_H );                    } /* SET  5,H=(XY+o)  */
  2674. OP(xxcb,ed) { _L = SET(5, RM(EA) ); WM( EA,_L );                    } /* SET  5,L=(XY+o)  */
  2675. OP(xxcb,ee) { WM( EA, SET(5,RM(EA)) );                                } /* SET  5,(XY+o)      */
  2676. OP(xxcb,ef) { _A = SET(5, RM(EA) ); WM( EA,_A );                    } /* SET  5,A=(XY+o)  */
  2677.  
  2678. OP(xxcb,f0) { _B = SET(6, RM(EA) ); WM( EA,_B );                    } /* SET  6,B=(XY+o)  */
  2679. OP(xxcb,f1) { _C = SET(6, RM(EA) ); WM( EA,_C );                    } /* SET  6,C=(XY+o)  */
  2680. OP(xxcb,f2) { _D = SET(6, RM(EA) ); WM( EA,_D );                    } /* SET  6,D=(XY+o)  */
  2681. OP(xxcb,f3) { _E = SET(6, RM(EA) ); WM( EA,_E );                    } /* SET  6,E=(XY+o)  */
  2682. OP(xxcb,f4) { _H = SET(6, RM(EA) ); WM( EA,_H );                    } /* SET  6,H=(XY+o)  */
  2683. OP(xxcb,f5) { _L = SET(6, RM(EA) ); WM( EA,_L );                    } /* SET  6,L=(XY+o)  */
  2684. OP(xxcb,f6) { WM( EA, SET(6,RM(EA)) );                                } /* SET  6,(XY+o)      */
  2685. OP(xxcb,f7) { _A = SET(6, RM(EA) ); WM( EA,_A );                    } /* SET  6,A=(XY+o)  */
  2686.  
  2687. OP(xxcb,f8) { _B = SET(7, RM(EA) ); WM( EA,_B );                    } /* SET  7,B=(XY+o)  */
  2688. OP(xxcb,f9) { _C = SET(7, RM(EA) ); WM( EA,_C );                    } /* SET  7,C=(XY+o)  */
  2689. OP(xxcb,fa) { _D = SET(7, RM(EA) ); WM( EA,_D );                    } /* SET  7,D=(XY+o)  */
  2690. OP(xxcb,fb) { _E = SET(7, RM(EA) ); WM( EA,_E );                    } /* SET  7,E=(XY+o)  */
  2691. OP(xxcb,fc) { _H = SET(7, RM(EA) ); WM( EA,_H );                    } /* SET  7,H=(XY+o)  */
  2692. OP(xxcb,fd) { _L = SET(7, RM(EA) ); WM( EA,_L );                    } /* SET  7,L=(XY+o)  */
  2693. OP(xxcb,fe) { WM( EA, SET(7,RM(EA)) );                                } /* SET  7,(XY+o)      */
  2694. OP(xxcb,ff) { _A = SET(7, RM(EA) ); WM( EA,_A );                    } /* SET  7,A=(XY+o)  */
  2695.  
  2696. OP(illegal,1) {
  2697.     _PC--;
  2698.     logerror("Z80#%d ill. opcode $%02x $%02x\n",
  2699.             cpu_getactivecpu(), cpu_readop((_PCD-1)&0xffff), cpu_readop(_PCD));
  2700. }
  2701.  
  2702. /**********************************************************
  2703.  * IX register related opcodes (DD prefix)
  2704.  **********************************************************/
  2705. OP(dd,00) { illegal_1();                                            } /* DB   DD          */
  2706. OP(dd,01) { illegal_1();                                            } /* DB   DD          */
  2707. OP(dd,02) { illegal_1();                                            } /* DB   DD          */
  2708. OP(dd,03) { illegal_1();                                            } /* DB   DD          */
  2709. OP(dd,04) { illegal_1();                                            } /* DB   DD          */
  2710. OP(dd,05) { illegal_1();                                            } /* DB   DD          */
  2711. OP(dd,06) { illegal_1();                                            } /* DB   DD          */
  2712. OP(dd,07) { illegal_1();                                            } /* DB   DD          */
  2713.  
  2714. OP(dd,08) { illegal_1();                                            } /* DB   DD          */
  2715. OP(dd,09) { ADD16(IX,BC);                                            } /* ADD  IX,BC       */
  2716. OP(dd,0a) { illegal_1();                                            } /* DB   DD          */
  2717. OP(dd,0b) { illegal_1();                                            } /* DB   DD          */
  2718. OP(dd,0c) { illegal_1();                                            } /* DB   DD          */
  2719. OP(dd,0d) { illegal_1();                                            } /* DB   DD          */
  2720. OP(dd,0e) { illegal_1();                                            } /* DB   DD          */
  2721. OP(dd,0f) { illegal_1();                                            } /* DB   DD          */
  2722.  
  2723. OP(dd,10) { illegal_1();                                            } /* DB   DD          */
  2724. OP(dd,11) { illegal_1();                                            } /* DB   DD          */
  2725. OP(dd,12) { illegal_1();                                            } /* DB   DD          */
  2726. OP(dd,13) { illegal_1();                                            } /* DB   DD          */
  2727. OP(dd,14) { illegal_1();                                            } /* DB   DD          */
  2728. OP(dd,15) { illegal_1();                                            } /* DB   DD          */
  2729. OP(dd,16) { illegal_1();                                            } /* DB   DD          */
  2730. OP(dd,17) { illegal_1();                                            } /* DB   DD          */
  2731.  
  2732. OP(dd,18) { illegal_1();                                            } /* DB   DD          */
  2733. OP(dd,19) { ADD16(IX,DE);                                            } /* ADD  IX,DE       */
  2734. OP(dd,1a) { illegal_1();                                            } /* DB   DD          */
  2735. OP(dd,1b) { illegal_1();                                            } /* DB   DD          */
  2736. OP(dd,1c) { illegal_1();                                            } /* DB   DD          */
  2737. OP(dd,1d) { illegal_1();                                            } /* DB   DD          */
  2738. OP(dd,1e) { illegal_1();                                            } /* DB   DD          */
  2739. OP(dd,1f) { illegal_1();                                            } /* DB   DD          */
  2740.  
  2741. OP(dd,20) { illegal_1();                                            } /* DB   DD          */
  2742. OP(dd,21) { _IX = ARG16();                                            } /* LD   IX,w          */
  2743. OP(dd,22) { EA = ARG16(); WM16( EA, &Z80.IX );                        } /* LD   (w),IX      */
  2744. OP(dd,23) { _IX++;                                                    } /* INC  IX          */
  2745. OP(dd,24) { _HX = INC(_HX);                                         } /* INC  HX          */
  2746. OP(dd,25) { _HX = DEC(_HX);                                         } /* DEC  HX          */
  2747. OP(dd,26) { _HX = ARG();                                            } /* LD   HX,n          */
  2748. OP(dd,27) { illegal_1();                                            } /* DB   DD          */
  2749.  
  2750. OP(dd,28) { illegal_1();                                            } /* DB   DD          */
  2751. OP(dd,29) { ADD16(IX,IX);                                            } /* ADD  IX,IX       */
  2752. OP(dd,2a) { EA = ARG16(); RM16( EA, &Z80.IX );                        } /* LD   IX,(w)      */
  2753. OP(dd,2b) { _IX--;                                                    } /* DEC  IX          */
  2754. OP(dd,2c) { _LX = INC(_LX);                                         } /* INC  LX          */
  2755. OP(dd,2d) { _LX = DEC(_LX);                                         } /* DEC  LX          */
  2756. OP(dd,2e) { _LX = ARG();                                            } /* LD   LX,n          */
  2757. OP(dd,2f) { illegal_1();                                            } /* DB   DD          */
  2758.  
  2759. OP(dd,30) { illegal_1();                                            } /* DB   DD          */
  2760. OP(dd,31) { illegal_1();                                            } /* DB   DD          */
  2761. OP(dd,32) { illegal_1();                                            } /* DB   DD          */
  2762. OP(dd,33) { illegal_1();                                            } /* DB   DD          */
  2763. OP(dd,34) { EAX; WM( EA, INC(RM(EA)) );                             } /* INC  (IX+o)      */
  2764. OP(dd,35) { EAX; WM( EA, DEC(RM(EA)) );                             } /* DEC  (IX+o)      */
  2765. OP(dd,36) { EAX; WM( EA, ARG() );                                    } /* LD   (IX+o),n      */
  2766. OP(dd,37) { illegal_1();                                            } /* DB   DD          */
  2767.  
  2768. OP(dd,38) { illegal_1();                                            } /* DB   DD          */
  2769. OP(dd,39) { ADD16(IX,SP);                                            } /* ADD  IX,SP       */
  2770. OP(dd,3a) { illegal_1();                                            } /* DB   DD          */
  2771. OP(dd,3b) { illegal_1();                                            } /* DB   DD          */
  2772. OP(dd,3c) { illegal_1();                                            } /* DB   DD          */
  2773. OP(dd,3d) { illegal_1();                                            } /* DB   DD          */
  2774. OP(dd,3e) { illegal_1();                                            } /* DB   DD          */
  2775. OP(dd,3f) { illegal_1();                                            } /* DB   DD          */
  2776.  
  2777. OP(dd,40) { illegal_1();                                            } /* DB   DD          */
  2778. OP(dd,41) { illegal_1();                                            } /* DB   DD          */
  2779. OP(dd,42) { illegal_1();                                            } /* DB   DD          */
  2780. OP(dd,43) { illegal_1();                                            } /* DB   DD          */
  2781. OP(dd,44) { _B = _HX;                                                } /* LD   B,HX          */
  2782. OP(dd,45) { _B = _LX;                                                } /* LD   B,LX          */
  2783. OP(dd,46) { EAX; _B = RM(EA);                                        } /* LD   B,(IX+o)      */
  2784. OP(dd,47) { illegal_1();                                            } /* DB   DD          */
  2785.  
  2786. OP(dd,48) { illegal_1();                                            } /* DB   DD          */
  2787. OP(dd,49) { illegal_1();                                            } /* DB   DD          */
  2788. OP(dd,4a) { illegal_1();                                            } /* DB   DD          */
  2789. OP(dd,4b) { illegal_1();                                            } /* DB   DD          */
  2790. OP(dd,4c) { _C = _HX;                                                } /* LD   C,HX          */
  2791. OP(dd,4d) { _C = _LX;                                                } /* LD   C,LX          */
  2792. OP(dd,4e) { EAX; _C = RM(EA);                                        } /* LD   C,(IX+o)      */
  2793. OP(dd,4f) { illegal_1();                                            } /* DB   DD          */
  2794.  
  2795. OP(dd,50) { illegal_1();                                            } /* DB   DD          */
  2796. OP(dd,51) { illegal_1();                                            } /* DB   DD          */
  2797. OP(dd,52) { illegal_1();                                            } /* DB   DD          */
  2798. OP(dd,53) { illegal_1();                                            } /* DB   DD          */
  2799. OP(dd,54) { _D = _HX;                                                } /* LD   D,HX          */
  2800. OP(dd,55) { _D = _LX;                                                } /* LD   D,LX          */
  2801. OP(dd,56) { EAX; _D = RM(EA);                                        } /* LD   D,(IX+o)      */
  2802. OP(dd,57) { illegal_1();                                            } /* DB   DD          */
  2803.  
  2804. OP(dd,58) { illegal_1();                                            } /* DB   DD          */
  2805. OP(dd,59) { illegal_1();                                            } /* DB   DD          */
  2806. OP(dd,5a) { illegal_1();                                            } /* DB   DD          */
  2807. OP(dd,5b) { illegal_1();                                            } /* DB   DD          */
  2808. OP(dd,5c) { _E = _HX;                                                } /* LD   E,HX          */
  2809. OP(dd,5d) { _E = _LX;                                                } /* LD   E,LX          */
  2810. OP(dd,5e) { EAX; _E = RM(EA);                                        } /* LD   E,(IX+o)      */
  2811. OP(dd,5f) { illegal_1();                                            } /* DB   DD          */
  2812.  
  2813. OP(dd,60) { _HX = _B;                                                } /* LD   HX,B          */
  2814. OP(dd,61) { _HX = _C;                                                } /* LD   HX,C          */
  2815. OP(dd,62) { _HX = _D;                                                } /* LD   HX,D          */
  2816. OP(dd,63) { _HX = _E;                                                } /* LD   HX,E          */
  2817. OP(dd,64) {                                                         } /* LD   HX,HX       */
  2818. OP(dd,65) { _HX = _LX;                                                } /* LD   HX,LX       */
  2819. OP(dd,66) { EAX; _H = RM(EA);                                        } /* LD   H,(IX+o)      */
  2820. OP(dd,67) { _HX = _A;                                                } /* LD   HX,A          */
  2821.  
  2822. OP(dd,68) { _LX = _B;                                                } /* LD   LX,B          */
  2823. OP(dd,69) { _LX = _C;                                                } /* LD   LX,C          */
  2824. OP(dd,6a) { _LX = _D;                                                } /* LD   LX,D          */
  2825. OP(dd,6b) { _LX = _E;                                                } /* LD   LX,E          */
  2826. OP(dd,6c) { _LX = _HX;                                                } /* LD   LX,HX       */
  2827. OP(dd,6d) {                                                         } /* LD   LX,LX       */
  2828. OP(dd,6e) { EAX; _L = RM(EA);                                        } /* LD   L,(IX+o)      */
  2829. OP(dd,6f) { _LX = _A;                                                } /* LD   LX,A          */
  2830.  
  2831. OP(dd,70) { EAX; WM( EA, _B );                                        } /* LD   (IX+o),B      */
  2832. OP(dd,71) { EAX; WM( EA, _C );                                        } /* LD   (IX+o),C      */
  2833. OP(dd,72) { EAX; WM( EA, _D );                                        } /* LD   (IX+o),D      */
  2834. OP(dd,73) { EAX; WM( EA, _E );                                        } /* LD   (IX+o),E      */
  2835. OP(dd,74) { EAX; WM( EA, _H );                                        } /* LD   (IX+o),H      */
  2836. OP(dd,75) { EAX; WM( EA, _L );                                        } /* LD   (IX+o),L      */
  2837. OP(dd,76) { illegal_1();                                            }          /* DB   DD          */
  2838. OP(dd,77) { EAX; WM( EA, _A );                                        } /* LD   (IX+o),A      */
  2839.  
  2840. OP(dd,78) { illegal_1();                                            } /* DB   DD          */
  2841. OP(dd,79) { illegal_1();                                            } /* DB   DD          */
  2842. OP(dd,7a) { illegal_1();                                            } /* DB   DD          */
  2843. OP(dd,7b) { illegal_1();                                            } /* DB   DD          */
  2844. OP(dd,7c) { _A = _HX;                                                } /* LD   A,HX          */
  2845. OP(dd,7d) { _A = _LX;                                                } /* LD   A,LX          */
  2846. OP(dd,7e) { EAX; _A = RM(EA);                                        } /* LD   A,(IX+o)      */
  2847. OP(dd,7f) { illegal_1();                                            } /* DB   DD          */
  2848.  
  2849. OP(dd,80) { illegal_1();                                            } /* DB   DD          */
  2850. OP(dd,81) { illegal_1();                                            } /* DB   DD          */
  2851. OP(dd,82) { illegal_1();                                            } /* DB   DD          */
  2852. OP(dd,83) { illegal_1();                                            } /* DB   DD          */
  2853. OP(dd,84) { ADD(_HX);                                                } /* ADD  A,HX          */
  2854. OP(dd,85) { ADD(_LX);                                                } /* ADD  A,LX          */
  2855. OP(dd,86) { EAX; ADD(RM(EA));                                        } /* ADD  A,(IX+o)      */
  2856. OP(dd,87) { illegal_1();                                            } /* DB   DD          */
  2857.  
  2858. OP(dd,88) { illegal_1();                                            } /* DB   DD          */
  2859. OP(dd,89) { illegal_1();                                            } /* DB   DD          */
  2860. OP(dd,8a) { illegal_1();                                            } /* DB   DD          */
  2861. OP(dd,8b) { illegal_1();                                            } /* DB   DD          */
  2862. OP(dd,8c) { ADC(_HX);                                                } /* ADC  A,HX          */
  2863. OP(dd,8d) { ADC(_LX);                                                } /* ADC  A,LX          */
  2864. OP(dd,8e) { EAX; ADC(RM(EA));                                        } /* ADC  A,(IX+o)      */
  2865. OP(dd,8f) { illegal_1();                                            } /* DB   DD          */
  2866.  
  2867. OP(dd,90) { illegal_1();                                            } /* DB   DD          */
  2868. OP(dd,91) { illegal_1();                                            } /* DB   DD          */
  2869. OP(dd,92) { illegal_1();                                            } /* DB   DD          */
  2870. OP(dd,93) { illegal_1();                                            } /* DB   DD          */
  2871. OP(dd,94) { SUB(_HX);                                                } /* SUB  HX          */
  2872. OP(dd,95) { SUB(_LX);                                                } /* SUB  LX          */
  2873. OP(dd,96) { EAX; SUB(RM(EA));                                        } /* SUB  (IX+o)      */
  2874. OP(dd,97) { illegal_1();                                            } /* DB   DD          */
  2875.  
  2876. OP(dd,98) { illegal_1();                                            } /* DB   DD          */
  2877. OP(dd,99) { illegal_1();                                            } /* DB   DD          */
  2878. OP(dd,9a) { illegal_1();                                            } /* DB   DD          */
  2879. OP(dd,9b) { illegal_1();                                            } /* DB   DD          */
  2880. OP(dd,9c) { SBC(_HX);                                                } /* SBC  A,HX          */
  2881. OP(dd,9d) { SBC(_LX);                                                } /* SBC  A,LX          */
  2882. OP(dd,9e) { EAX; SBC(RM(EA));                                        } /* SBC  A,(IX+o)      */
  2883. OP(dd,9f) { illegal_1();                                            } /* DB   DD          */
  2884.  
  2885. OP(dd,a0) { illegal_1();                                            } /* DB   DD          */
  2886. OP(dd,a1) { illegal_1();                                            } /* DB   DD          */
  2887. OP(dd,a2) { illegal_1();                                            } /* DB   DD          */
  2888. OP(dd,a3) { illegal_1();                                            } /* DB   DD          */
  2889. OP(dd,a4) { AND(_HX);                                                } /* AND  HX          */
  2890. OP(dd,a5) { AND(_LX);                                                } /* AND  LX          */
  2891. OP(dd,a6) { EAX; AND(RM(EA));                                        } /* AND  (IX+o)      */
  2892. OP(dd,a7) { illegal_1();                                            } /* DB   DD          */
  2893.  
  2894. OP(dd,a8) { illegal_1();                                            } /* DB   DD          */
  2895. OP(dd,a9) { illegal_1();                                            } /* DB   DD          */
  2896. OP(dd,aa) { illegal_1();                                            } /* DB   DD          */
  2897. OP(dd,ab) { illegal_1();                                            } /* DB   DD          */
  2898. OP(dd,ac) { XOR(_HX);                                                } /* XOR  HX          */
  2899. OP(dd,ad) { XOR(_LX);                                                } /* XOR  LX          */
  2900. OP(dd,ae) { EAX; XOR(RM(EA));                                        } /* XOR  (IX+o)      */
  2901. OP(dd,af) { illegal_1();                                            } /* DB   DD          */
  2902.  
  2903. OP(dd,b0) { illegal_1();                                            } /* DB   DD          */
  2904. OP(dd,b1) { illegal_1();                                            } /* DB   DD          */
  2905. OP(dd,b2) { illegal_1();                                            } /* DB   DD          */
  2906. OP(dd,b3) { illegal_1();                                            } /* DB   DD          */
  2907. OP(dd,b4) { OR(_HX);                                                } /* OR   HX          */
  2908. OP(dd,b5) { OR(_LX);                                                } /* OR   LX          */
  2909. OP(dd,b6) { EAX; OR(RM(EA));                                        } /* OR   (IX+o)      */
  2910. OP(dd,b7) { illegal_1();                                            } /* DB   DD          */
  2911.  
  2912. OP(dd,b8) { illegal_1();                                            } /* DB   DD          */
  2913. OP(dd,b9) { illegal_1();                                            } /* DB   DD          */
  2914. OP(dd,ba) { illegal_1();                                            } /* DB   DD          */
  2915. OP(dd,bb) { illegal_1();                                            } /* DB   DD          */
  2916. OP(dd,bc) { CP(_HX);                                                } /* CP   HX          */
  2917. OP(dd,bd) { CP(_LX);                                                } /* CP   LX          */
  2918. OP(dd,be) { EAX; CP(RM(EA));                                        } /* CP   (IX+o)      */
  2919. OP(dd,bf) { illegal_1();                                            } /* DB   DD          */
  2920.  
  2921. OP(dd,c0) { illegal_1();                                            } /* DB   DD          */
  2922. OP(dd,c1) { illegal_1();                                            } /* DB   DD          */
  2923. OP(dd,c2) { illegal_1();                                            } /* DB   DD          */
  2924. OP(dd,c3) { illegal_1();                                            } /* DB   DD          */
  2925. OP(dd,c4) { illegal_1();                                            } /* DB   DD          */
  2926. OP(dd,c5) { illegal_1();                                            } /* DB   DD          */
  2927. OP(dd,c6) { illegal_1();                                            } /* DB   DD          */
  2928. OP(dd,c7) { illegal_1();                                            }          /* DB   DD          */
  2929.  
  2930. OP(dd,c8) { illegal_1();                                            } /* DB   DD          */
  2931. OP(dd,c9) { illegal_1();                                            } /* DB   DD          */
  2932. OP(dd,ca) { illegal_1();                                            } /* DB   DD          */
  2933. OP(dd,cb) { EAX; EXEC(xxcb,ARG());                                    } /* **   DD CB xx      */
  2934. OP(dd,cc) { illegal_1();                                            } /* DB   DD          */
  2935. OP(dd,cd) { illegal_1();                                            } /* DB   DD          */
  2936. OP(dd,ce) { illegal_1();                                            } /* DB   DD          */
  2937. OP(dd,cf) { illegal_1();                                            } /* DB   DD          */
  2938.  
  2939. OP(dd,d0) { illegal_1();                                            } /* DB   DD          */
  2940. OP(dd,d1) { illegal_1();                                            } /* DB   DD          */
  2941. OP(dd,d2) { illegal_1();                                            } /* DB   DD          */
  2942. OP(dd,d3) { illegal_1();                                            } /* DB   DD          */
  2943. OP(dd,d4) { illegal_1();                                            } /* DB   DD          */
  2944. OP(dd,d5) { illegal_1();                                            } /* DB   DD          */
  2945. OP(dd,d6) { illegal_1();                                            } /* DB   DD          */
  2946. OP(dd,d7) { illegal_1();                                            } /* DB   DD          */
  2947.  
  2948. OP(dd,d8) { illegal_1();                                            } /* DB   DD          */
  2949. OP(dd,d9) { illegal_1();                                            } /* DB   DD          */
  2950. OP(dd,da) { illegal_1();                                            } /* DB   DD          */
  2951. OP(dd,db) { illegal_1();                                            } /* DB   DD          */
  2952. OP(dd,dc) { illegal_1();                                            } /* DB   DD          */
  2953. OP(dd,dd) { illegal_1();                                            } /* DB   DD          */
  2954. OP(dd,de) { illegal_1();                                            } /* DB   DD          */
  2955. OP(dd,df) { illegal_1();                                            } /* DB   DD          */
  2956.  
  2957. OP(dd,e0) { illegal_1();                                            } /* DB   DD          */
  2958. OP(dd,e1) { POP(IX);                                                } /* POP  IX          */
  2959. OP(dd,e2) { illegal_1();                                            } /* DB   DD          */
  2960. OP(dd,e3) { EXSP(IX);                                                } /* EX   (SP),IX      */
  2961. OP(dd,e4) { illegal_1();                                            } /* DB   DD          */
  2962. OP(dd,e5) { PUSH( IX );                                             } /* PUSH IX          */
  2963. OP(dd,e6) { illegal_1();                                            } /* DB   DD          */
  2964. OP(dd,e7) { illegal_1();                                            } /* DB   DD          */
  2965.  
  2966. OP(dd,e8) { illegal_1();                                            } /* DB   DD          */
  2967. OP(dd,e9) { _PC = _IX; change_pc16(_PCD);                            } /* JP   (IX)          */
  2968. OP(dd,ea) { illegal_1();                                            } /* DB   DD          */
  2969. OP(dd,eb) { illegal_1();                                            } /* DB   DD          */
  2970. OP(dd,ec) { illegal_1();                                            } /* DB   DD          */
  2971. OP(dd,ed) { illegal_1();                                            } /* DB   DD          */
  2972. OP(dd,ee) { illegal_1();                                            } /* DB   DD          */
  2973. OP(dd,ef) { illegal_1();                                            } /* DB   DD          */
  2974.  
  2975. OP(dd,f0) { illegal_1();                                            } /* DB   DD          */
  2976. OP(dd,f1) { illegal_1();                                            } /* DB   DD          */
  2977. OP(dd,f2) { illegal_1();                                            } /* DB   DD          */
  2978. OP(dd,f3) { illegal_1();                                            } /* DB   DD          */
  2979. OP(dd,f4) { illegal_1();                                            } /* DB   DD          */
  2980. OP(dd,f5) { illegal_1();                                            } /* DB   DD          */
  2981. OP(dd,f6) { illegal_1();                                            } /* DB   DD          */
  2982. OP(dd,f7) { illegal_1();                                            } /* DB   DD          */
  2983.  
  2984. OP(dd,f8) { illegal_1();                                            } /* DB   DD          */
  2985. OP(dd,f9) { _SP = _IX;                                                } /* LD   SP,IX       */
  2986. OP(dd,fa) { illegal_1();                                            } /* DB   DD          */
  2987. OP(dd,fb) { illegal_1();                                            } /* DB   DD          */
  2988. OP(dd,fc) { illegal_1();                                            } /* DB   DD          */
  2989. OP(dd,fd) { illegal_1();                                            } /* DB   DD          */
  2990. OP(dd,fe) { illegal_1();                                            } /* DB   DD          */
  2991. OP(dd,ff) { illegal_1();                                            } /* DB   DD          */
  2992.  
  2993. /**********************************************************
  2994.  * IY register related opcodes (FD prefix)
  2995.  **********************************************************/
  2996. OP(fd,00) { illegal_1();                                            } /* DB   FD          */
  2997. OP(fd,01) { illegal_1();                                            } /* DB   FD          */
  2998. OP(fd,02) { illegal_1();                                            } /* DB   FD          */
  2999. OP(fd,03) { illegal_1();                                            } /* DB   FD          */
  3000. OP(fd,04) { illegal_1();                                            } /* DB   FD          */
  3001. OP(fd,05) { illegal_1();                                            } /* DB   FD          */
  3002. OP(fd,06) { illegal_1();                                            } /* DB   FD          */
  3003. OP(fd,07) { illegal_1();                                            } /* DB   FD          */
  3004.  
  3005. OP(fd,08) { illegal_1();                                            } /* DB   FD          */
  3006. OP(fd,09) { ADD16(IY,BC);                                            } /* ADD  IY,BC       */
  3007. OP(fd,0a) { illegal_1();                                            } /* DB   FD          */
  3008. OP(fd,0b) { illegal_1();                                            } /* DB   FD          */
  3009. OP(fd,0c) { illegal_1();                                            } /* DB   FD          */
  3010. OP(fd,0d) { illegal_1();                                            } /* DB   FD          */
  3011. OP(fd,0e) { illegal_1();                                            } /* DB   FD          */
  3012. OP(fd,0f) { illegal_1();                                            } /* DB   FD          */
  3013.  
  3014. OP(fd,10) { illegal_1();                                            } /* DB   FD          */
  3015. OP(fd,11) { illegal_1();                                            } /* DB   FD          */
  3016. OP(fd,12) { illegal_1();                                            } /* DB   FD          */
  3017. OP(fd,13) { illegal_1();                                            } /* DB   FD          */
  3018. OP(fd,14) { illegal_1();                                            } /* DB   FD          */
  3019. OP(fd,15) { illegal_1();                                            } /* DB   FD          */
  3020. OP(fd,16) { illegal_1();                                            } /* DB   FD          */
  3021. OP(fd,17) { illegal_1();                                            } /* DB   FD          */
  3022.  
  3023. OP(fd,18) { illegal_1();                                            } /* DB   FD          */
  3024. OP(fd,19) { ADD16(IY,DE);                                            } /* ADD  IY,DE       */
  3025. OP(fd,1a) { illegal_1();                                            } /* DB   FD          */
  3026. OP(fd,1b) { illegal_1();                                            } /* DB   FD          */
  3027. OP(fd,1c) { illegal_1();                                            } /* DB   FD          */
  3028. OP(fd,1d) { illegal_1();                                            } /* DB   FD          */
  3029. OP(fd,1e) { illegal_1();                                            } /* DB   FD          */
  3030. OP(fd,1f) { illegal_1();                                            } /* DB   FD          */
  3031.  
  3032. OP(fd,20) { illegal_1();                                            } /* DB   FD          */
  3033. OP(fd,21) { _IY = ARG16();                                            } /* LD   IY,w          */
  3034. OP(fd,22) { EA = ARG16(); WM16( EA, &Z80.IY );                        } /* LD   (w),IY      */
  3035. OP(fd,23) { _IY++;                                                    } /* INC  IY          */
  3036. OP(fd,24) { _HY = INC(_HY);                                         } /* INC  HY          */
  3037. OP(fd,25) { _HY = DEC(_HY);                                         } /* DEC  HY          */
  3038. OP(fd,26) { _HY = ARG();                                            } /* LD   HY,n          */
  3039. OP(fd,27) { illegal_1();                                            } /* DB   FD          */
  3040.  
  3041. OP(fd,28) { illegal_1();                                            } /* DB   FD          */
  3042. OP(fd,29) { ADD16(IY,IY);                                            } /* ADD  IY,IY       */
  3043. OP(fd,2a) { EA = ARG16(); RM16( EA, &Z80.IY );                        } /* LD   IY,(w)      */
  3044. OP(fd,2b) { _IY--;                                                    } /* DEC  IY          */
  3045. OP(fd,2c) { _LY = INC(_LY);                                         } /* INC  LY          */
  3046. OP(fd,2d) { _LY = DEC(_LY);                                         } /* DEC  LY          */
  3047. OP(fd,2e) { _LY = ARG();                                            } /* LD   LY,n          */
  3048. OP(fd,2f) { illegal_1();                                            } /* DB   FD          */
  3049.  
  3050. OP(fd,30) { illegal_1();                                            } /* DB   FD          */
  3051. OP(fd,31) { illegal_1();                                            } /* DB   FD          */
  3052. OP(fd,32) { illegal_1();                                            } /* DB   FD          */
  3053. OP(fd,33) { illegal_1();                                            } /* DB   FD          */
  3054. OP(fd,34) { EAY; WM( EA, INC(RM(EA)) );                             } /* INC  (IY+o)      */
  3055. OP(fd,35) { EAY; WM( EA, DEC(RM(EA)) );                             } /* DEC  (IY+o)      */
  3056. OP(fd,36) { EAY; WM( EA, ARG() );                                    } /* LD   (IY+o),n      */
  3057. OP(fd,37) { illegal_1();                                            } /* DB   FD          */
  3058.  
  3059. OP(fd,38) { illegal_1();                                            } /* DB   FD          */
  3060. OP(fd,39) { ADD16(IY,SP);                                            } /* ADD  IY,SP       */
  3061. OP(fd,3a) { illegal_1();                                            } /* DB   FD          */
  3062. OP(fd,3b) { illegal_1();                                            } /* DB   FD          */
  3063. OP(fd,3c) { illegal_1();                                            } /* DB   FD          */
  3064. OP(fd,3d) { illegal_1();                                            } /* DB   FD          */
  3065. OP(fd,3e) { illegal_1();                                            } /* DB   FD          */
  3066. OP(fd,3f) { illegal_1();                                            } /* DB   FD          */
  3067.  
  3068. OP(fd,40) { illegal_1();                                            } /* DB   FD          */
  3069. OP(fd,41) { illegal_1();                                            } /* DB   FD          */
  3070. OP(fd,42) { illegal_1();                                            } /* DB   FD          */
  3071. OP(fd,43) { illegal_1();                                            } /* DB   FD          */
  3072. OP(fd,44) { _B = _HY;                                                } /* LD   B,HY          */
  3073. OP(fd,45) { _B = _LY;                                                } /* LD   B,LY          */
  3074. OP(fd,46) { EAY; _B = RM(EA);                                        } /* LD   B,(IY+o)      */
  3075. OP(fd,47) { illegal_1();                                            } /* DB   FD          */
  3076.  
  3077. OP(fd,48) { illegal_1();                                            } /* DB   FD          */
  3078. OP(fd,49) { illegal_1();                                            } /* DB   FD          */
  3079. OP(fd,4a) { illegal_1();                                            } /* DB   FD          */
  3080. OP(fd,4b) { illegal_1();                                            } /* DB   FD          */
  3081. OP(fd,4c) { _C = _HY;                                                } /* LD   C,HY          */
  3082. OP(fd,4d) { _C = _LY;                                                } /* LD   C,LY          */
  3083. OP(fd,4e) { EAY; _C = RM(EA);                                        } /* LD   C,(IY+o)      */
  3084. OP(fd,4f) { illegal_1();                                            } /* DB   FD          */
  3085.  
  3086. OP(fd,50) { illegal_1();                                            } /* DB   FD          */
  3087. OP(fd,51) { illegal_1();                                            } /* DB   FD          */
  3088. OP(fd,52) { illegal_1();                                            } /* DB   FD          */
  3089. OP(fd,53) { illegal_1();                                            } /* DB   FD          */
  3090. OP(fd,54) { _D = _HY;                                                } /* LD   D,HY          */
  3091. OP(fd,55) { _D = _LY;                                                } /* LD   D,LY          */
  3092. OP(fd,56) { EAY; _D = RM(EA);                                        } /* LD   D,(IY+o)      */
  3093. OP(fd,57) { illegal_1();                                            } /* DB   FD          */
  3094.  
  3095. OP(fd,58) { illegal_1();                                            } /* DB   FD          */
  3096. OP(fd,59) { illegal_1();                                            } /* DB   FD          */
  3097. OP(fd,5a) { illegal_1();                                            } /* DB   FD          */
  3098. OP(fd,5b) { illegal_1();                                            } /* DB   FD          */
  3099. OP(fd,5c) { _E = _HY;                                                } /* LD   E,HY          */
  3100. OP(fd,5d) { _E = _LY;                                                } /* LD   E,LY          */
  3101. OP(fd,5e) { EAY; _E = RM(EA);                                        } /* LD   E,(IY+o)      */
  3102. OP(fd,5f) { illegal_1();                                            } /* DB   FD          */
  3103.  
  3104. OP(fd,60) { _HY = _B;                                                } /* LD   HY,B          */
  3105. OP(fd,61) { _HY = _C;                                                } /* LD   HY,C          */
  3106. OP(fd,62) { _HY = _D;                                                } /* LD   HY,D          */
  3107. OP(fd,63) { _HY = _E;                                                } /* LD   HY,E          */
  3108. OP(fd,64) {                                                         } /* LD   HY,HY       */
  3109. OP(fd,65) { _HY = _LY;                                                } /* LD   HY,LY       */
  3110. OP(fd,66) { EAY; _H = RM(EA);                                        } /* LD   H,(IY+o)      */
  3111. OP(fd,67) { _HY = _A;                                                } /* LD   HY,A          */
  3112.  
  3113. OP(fd,68) { _LY = _B;                                                } /* LD   LY,B          */
  3114. OP(fd,69) { _LY = _C;                                                } /* LD   LY,C          */
  3115. OP(fd,6a) { _LY = _D;                                                } /* LD   LY,D          */
  3116. OP(fd,6b) { _LY = _E;                                                } /* LD   LY,E          */
  3117. OP(fd,6c) { _LY = _HY;                                                } /* LD   LY,HY       */
  3118. OP(fd,6d) {                                                         } /* LD   LY,LY       */
  3119. OP(fd,6e) { EAY; _L = RM(EA);                                        } /* LD   L,(IY+o)      */
  3120. OP(fd,6f) { _LY = _A;                                                } /* LD   LY,A          */
  3121.  
  3122. OP(fd,70) { EAY; WM( EA, _B );                                        } /* LD   (IY+o),B      */
  3123. OP(fd,71) { EAY; WM( EA, _C );                                        } /* LD   (IY+o),C      */
  3124. OP(fd,72) { EAY; WM( EA, _D );                                        } /* LD   (IY+o),D      */
  3125. OP(fd,73) { EAY; WM( EA, _E );                                        } /* LD   (IY+o),E      */
  3126. OP(fd,74) { EAY; WM( EA, _H );                                        } /* LD   (IY+o),H      */
  3127. OP(fd,75) { EAY; WM( EA, _L );                                        } /* LD   (IY+o),L      */
  3128. OP(fd,76) { illegal_1();                                            }          /* DB   FD          */
  3129. OP(fd,77) { EAY; WM( EA, _A );                                        } /* LD   (IY+o),A      */
  3130.  
  3131. OP(fd,78) { illegal_1();                                            } /* DB   FD          */
  3132. OP(fd,79) { illegal_1();                                            } /* DB   FD          */
  3133. OP(fd,7a) { illegal_1();                                            } /* DB   FD          */
  3134. OP(fd,7b) { illegal_1();                                            } /* DB   FD          */
  3135. OP(fd,7c) { _A = _HY;                                                } /* LD   A,HY          */
  3136. OP(fd,7d) { _A = _LY;                                                } /* LD   A,LY          */
  3137. OP(fd,7e) { EAY; _A = RM(EA);                                        } /* LD   A,(IY+o)      */
  3138. OP(fd,7f) { illegal_1();                                            } /* DB   FD          */
  3139.  
  3140. OP(fd,80) { illegal_1();                                            } /* DB   FD          */
  3141. OP(fd,81) { illegal_1();                                            } /* DB   FD          */
  3142. OP(fd,82) { illegal_1();                                            } /* DB   FD          */
  3143. OP(fd,83) { illegal_1();                                            } /* DB   FD          */
  3144. OP(fd,84) { ADD(_HY);                                                } /* ADD  A,HY          */
  3145. OP(fd,85) { ADD(_LY);                                                } /* ADD  A,LY          */
  3146. OP(fd,86) { EAY; ADD(RM(EA));                                        } /* ADD  A,(IY+o)      */
  3147. OP(fd,87) { illegal_1();                                            } /* DB   FD          */
  3148.  
  3149. OP(fd,88) { illegal_1();                                            } /* DB   FD          */
  3150. OP(fd,89) { illegal_1();                                            } /* DB   FD          */
  3151. OP(fd,8a) { illegal_1();                                            } /* DB   FD          */
  3152. OP(fd,8b) { illegal_1();                                            } /* DB   FD          */
  3153. OP(fd,8c) { ADC(_HY);                                                } /* ADC  A,HY          */
  3154. OP(fd,8d) { ADC(_LY);                                                } /* ADC  A,LY          */
  3155. OP(fd,8e) { EAY; ADC(RM(EA));                                        } /* ADC  A,(IY+o)      */
  3156. OP(fd,8f) { illegal_1();                                            } /* DB   FD          */
  3157.  
  3158. OP(fd,90) { illegal_1();                                            } /* DB   FD          */
  3159. OP(fd,91) { illegal_1();                                            } /* DB   FD          */
  3160. OP(fd,92) { illegal_1();                                            } /* DB   FD          */
  3161. OP(fd,93) { illegal_1();                                            } /* DB   FD          */
  3162. OP(fd,94) { SUB(_HY);                                                } /* SUB  HY          */
  3163. OP(fd,95) { SUB(_LY);                                                } /* SUB  LY          */
  3164. OP(fd,96) { EAY; SUB(RM(EA));                                        } /* SUB  (IY+o)      */
  3165. OP(fd,97) { illegal_1();                                            } /* DB   FD          */
  3166.  
  3167. OP(fd,98) { illegal_1();                                            } /* DB   FD          */
  3168. OP(fd,99) { illegal_1();                                            } /* DB   FD          */
  3169. OP(fd,9a) { illegal_1();                                            } /* DB   FD          */
  3170. OP(fd,9b) { illegal_1();                                            } /* DB   FD          */
  3171. OP(fd,9c) { SBC(_HY);                                                } /* SBC  A,HY          */
  3172. OP(fd,9d) { SBC(_LY);                                                } /* SBC  A,LY          */
  3173. OP(fd,9e) { EAY; SBC(RM(EA));                                        } /* SBC  A,(IY+o)      */
  3174. OP(fd,9f) { illegal_1();                                            } /* DB   FD          */
  3175.  
  3176. OP(fd,a0) { illegal_1();                                            } /* DB   FD          */
  3177. OP(fd,a1) { illegal_1();                                            } /* DB   FD          */
  3178. OP(fd,a2) { illegal_1();                                            } /* DB   FD          */
  3179. OP(fd,a3) { illegal_1();                                            } /* DB   FD          */
  3180. OP(fd,a4) { AND(_HY);                                                } /* AND  HY          */
  3181. OP(fd,a5) { AND(_LY);                                                } /* AND  LY          */
  3182. OP(fd,a6) { EAY; AND(RM(EA));                                        } /* AND  (IY+o)      */
  3183. OP(fd,a7) { illegal_1();                                            } /* DB   FD          */
  3184.  
  3185. OP(fd,a8) { illegal_1();                                            } /* DB   FD          */
  3186. OP(fd,a9) { illegal_1();                                            } /* DB   FD          */
  3187. OP(fd,aa) { illegal_1();                                            } /* DB   FD          */
  3188. OP(fd,ab) { illegal_1();                                            } /* DB   FD          */
  3189. OP(fd,ac) { XOR(_HY);                                                } /* XOR  HY          */
  3190. OP(fd,ad) { XOR(_LY);                                                } /* XOR  LY          */
  3191. OP(fd,ae) { EAY; XOR(RM(EA));                                        } /* XOR  (IY+o)      */
  3192. OP(fd,af) { illegal_1();                                            } /* DB   FD          */
  3193.  
  3194. OP(fd,b0) { illegal_1();                                            } /* DB   FD          */
  3195. OP(fd,b1) { illegal_1();                                            } /* DB   FD          */
  3196. OP(fd,b2) { illegal_1();                                            } /* DB   FD          */
  3197. OP(fd,b3) { illegal_1();                                            } /* DB   FD          */
  3198. OP(fd,b4) { OR(_HY);                                                } /* OR   HY          */
  3199. OP(fd,b5) { OR(_LY);                                                } /* OR   LY          */
  3200. OP(fd,b6) { EAY; OR(RM(EA));                                        } /* OR   (IY+o)      */
  3201. OP(fd,b7) { illegal_1();                                            } /* DB   FD          */
  3202.  
  3203. OP(fd,b8) { illegal_1();                                            } /* DB   FD          */
  3204. OP(fd,b9) { illegal_1();                                            } /* DB   FD          */
  3205. OP(fd,ba) { illegal_1();                                            } /* DB   FD          */
  3206. OP(fd,bb) { illegal_1();                                            } /* DB   FD          */
  3207. OP(fd,bc) { CP(_HY);                                                } /* CP   HY          */
  3208. OP(fd,bd) { CP(_LY);                                                } /* CP   LY          */
  3209. OP(fd,be) { EAY; CP(RM(EA));                                        } /* CP   (IY+o)      */
  3210. OP(fd,bf) { illegal_1();                                            } /* DB   FD          */
  3211.  
  3212. OP(fd,c0) { illegal_1();                                            } /* DB   FD          */
  3213. OP(fd,c1) { illegal_1();                                            } /* DB   FD          */
  3214. OP(fd,c2) { illegal_1();                                            } /* DB   FD          */
  3215. OP(fd,c3) { illegal_1();                                            } /* DB   FD          */
  3216. OP(fd,c4) { illegal_1();                                            } /* DB   FD          */
  3217. OP(fd,c5) { illegal_1();                                            } /* DB   FD          */
  3218. OP(fd,c6) { illegal_1();                                            } /* DB   FD          */
  3219. OP(fd,c7) { illegal_1();                                            } /* DB   FD          */
  3220.  
  3221. OP(fd,c8) { illegal_1();                                            } /* DB   FD          */
  3222. OP(fd,c9) { illegal_1();                                            } /* DB   FD          */
  3223. OP(fd,ca) { illegal_1();                                            } /* DB   FD          */
  3224. OP(fd,cb) { EAY; EXEC(xxcb,ARG());                                    } /* **   FD CB xx      */
  3225. OP(fd,cc) { illegal_1();                                            } /* DB   FD          */
  3226. OP(fd,cd) { illegal_1();                                            } /* DB   FD          */
  3227. OP(fd,ce) { illegal_1();                                            } /* DB   FD          */
  3228. OP(fd,cf) { illegal_1();                                            } /* DB   FD          */
  3229.  
  3230. OP(fd,d0) { illegal_1();                                            } /* DB   FD          */
  3231. OP(fd,d1) { illegal_1();                                            } /* DB   FD          */
  3232. OP(fd,d2) { illegal_1();                                            } /* DB   FD          */
  3233. OP(fd,d3) { illegal_1();                                            } /* DB   FD          */
  3234. OP(fd,d4) { illegal_1();                                            } /* DB   FD          */
  3235. OP(fd,d5) { illegal_1();                                            } /* DB   FD          */
  3236. OP(fd,d6) { illegal_1();                                            } /* DB   FD          */
  3237. OP(fd,d7) { illegal_1();                                            } /* DB   FD          */
  3238.  
  3239. OP(fd,d8) { illegal_1();                                            } /* DB   FD          */
  3240. OP(fd,d9) { illegal_1();                                            } /* DB   FD          */
  3241. OP(fd,da) { illegal_1();                                            } /* DB   FD          */
  3242. OP(fd,db) { illegal_1();                                            } /* DB   FD          */
  3243. OP(fd,dc) { illegal_1();                                            } /* DB   FD          */
  3244. OP(fd,dd) { illegal_1();                                            } /* DB   FD          */
  3245. OP(fd,de) { illegal_1();                                            } /* DB   FD          */
  3246. OP(fd,df) { illegal_1();                                            } /* DB   FD          */
  3247.  
  3248. OP(fd,e0) { illegal_1();                                            } /* DB   FD          */
  3249. OP(fd,e1) { POP(IY);                                                } /* POP  IY          */
  3250. OP(fd,e2) { illegal_1();                                            } /* DB   FD          */
  3251. OP(fd,e3) { EXSP(IY);                                                } /* EX   (SP),IY      */
  3252. OP(fd,e4) { illegal_1();                                            } /* DB   FD          */
  3253. OP(fd,e5) { PUSH( IY );                                             } /* PUSH IY          */
  3254. OP(fd,e6) { illegal_1();                                            } /* DB   FD          */
  3255. OP(fd,e7) { illegal_1();                                            } /* DB   FD          */
  3256.  
  3257. OP(fd,e8) { illegal_1();                                            } /* DB   FD          */
  3258. OP(fd,e9) { _PC = _IY; change_pc16(_PCD);                            } /* JP   (IY)          */
  3259. OP(fd,ea) { illegal_1();                                            } /* DB   FD          */
  3260. OP(fd,eb) { illegal_1();                                            } /* DB   FD          */
  3261. OP(fd,ec) { illegal_1();                                            } /* DB   FD          */
  3262. OP(fd,ed) { illegal_1();                                            } /* DB   FD          */
  3263. OP(fd,ee) { illegal_1();                                            } /* DB   FD          */
  3264. OP(fd,ef) { illegal_1();                                            } /* DB   FD          */
  3265.  
  3266. OP(fd,f0) { illegal_1();                                            } /* DB   FD          */
  3267. OP(fd,f1) { illegal_1();                                            } /* DB   FD          */
  3268. OP(fd,f2) { illegal_1();                                            } /* DB   FD          */
  3269. OP(fd,f3) { illegal_1();                                            } /* DB   FD          */
  3270. OP(fd,f4) { illegal_1();                                            } /* DB   FD          */
  3271. OP(fd,f5) { illegal_1();                                            } /* DB   FD          */
  3272. OP(fd,f6) { illegal_1();                                            } /* DB   FD          */
  3273. OP(fd,f7) { illegal_1();                                            } /* DB   FD          */
  3274.  
  3275. OP(fd,f8) { illegal_1();                                            } /* DB   FD          */
  3276. OP(fd,f9) { _SP = _IY;                                                } /* LD   SP,IY       */
  3277. OP(fd,fa) { illegal_1();                                            } /* DB   FD          */
  3278. OP(fd,fb) { illegal_1();                                            } /* DB   FD          */
  3279. OP(fd,fc) { illegal_1();                                            } /* DB   FD          */
  3280. OP(fd,fd) { illegal_1();                                            } /* DB   FD          */
  3281. OP(fd,fe) { illegal_1();                                            } /* DB   FD          */
  3282. OP(fd,ff) { illegal_1();                                            } /* DB   FD          */
  3283.  
  3284. OP(illegal,2)
  3285. {
  3286.     logerror("Z80#%d ill. opcode $ed $%02x\n",
  3287.             cpu_getactivecpu(), cpu_readop((_PCD-1)&0xffff));
  3288. }
  3289.  
  3290. /**********************************************************
  3291.  * special opcodes (ED prefix)
  3292.  **********************************************************/
  3293. OP(ed,00) { illegal_2();                                            } /* DB   ED          */
  3294. OP(ed,01) { illegal_2();                                            } /* DB   ED          */
  3295. OP(ed,02) { illegal_2();                                            } /* DB   ED          */
  3296. OP(ed,03) { illegal_2();                                            } /* DB   ED          */
  3297. OP(ed,04) { illegal_2();                                            } /* DB   ED          */
  3298. OP(ed,05) { illegal_2();                                            } /* DB   ED          */
  3299. OP(ed,06) { illegal_2();                                            } /* DB   ED          */
  3300. OP(ed,07) { illegal_2();                                            } /* DB   ED          */
  3301.  
  3302. OP(ed,08) { illegal_2();                                            } /* DB   ED          */
  3303. OP(ed,09) { illegal_2();                                            } /* DB   ED          */
  3304. OP(ed,0a) { illegal_2();                                            } /* DB   ED          */
  3305. OP(ed,0b) { illegal_2();                                            } /* DB   ED          */
  3306. OP(ed,0c) { illegal_2();                                            } /* DB   ED          */
  3307. OP(ed,0d) { illegal_2();                                            } /* DB   ED          */
  3308. OP(ed,0e) { illegal_2();                                            } /* DB   ED          */
  3309. OP(ed,0f) { illegal_2();                                            } /* DB   ED          */
  3310.  
  3311. OP(ed,10) { illegal_2();                                            } /* DB   ED          */
  3312. OP(ed,11) { illegal_2();                                            } /* DB   ED          */
  3313. OP(ed,12) { illegal_2();                                            } /* DB   ED          */
  3314. OP(ed,13) { illegal_2();                                            } /* DB   ED          */
  3315. OP(ed,14) { illegal_2();                                            } /* DB   ED          */
  3316. OP(ed,15) { illegal_2();                                            } /* DB   ED          */
  3317. OP(ed,16) { illegal_2();                                            } /* DB   ED          */
  3318. OP(ed,17) { illegal_2();                                            } /* DB   ED          */
  3319.  
  3320. OP(ed,18) { illegal_2();                                            } /* DB   ED          */
  3321. OP(ed,19) { illegal_2();                                            } /* DB   ED          */
  3322. OP(ed,1a) { illegal_2();                                            } /* DB   ED          */
  3323. OP(ed,1b) { illegal_2();                                            } /* DB   ED          */
  3324. OP(ed,1c) { illegal_2();                                            } /* DB   ED          */
  3325. OP(ed,1d) { illegal_2();                                            } /* DB   ED          */
  3326. OP(ed,1e) { illegal_2();                                            } /* DB   ED          */
  3327. OP(ed,1f) { illegal_2();                                            } /* DB   ED          */
  3328.  
  3329. OP(ed,20) { illegal_2();                                            } /* DB   ED          */
  3330. OP(ed,21) { illegal_2();                                            } /* DB   ED          */
  3331. OP(ed,22) { illegal_2();                                            } /* DB   ED          */
  3332. OP(ed,23) { illegal_2();                                            } /* DB   ED          */
  3333. OP(ed,24) { illegal_2();                                            } /* DB   ED          */
  3334. OP(ed,25) { illegal_2();                                            } /* DB   ED          */
  3335. OP(ed,26) { illegal_2();                                            } /* DB   ED          */
  3336. OP(ed,27) { illegal_2();                                            } /* DB   ED          */
  3337.  
  3338. OP(ed,28) { illegal_2();                                            } /* DB   ED          */
  3339. OP(ed,29) { illegal_2();                                            } /* DB   ED          */
  3340. OP(ed,2a) { illegal_2();                                            } /* DB   ED          */
  3341. OP(ed,2b) { illegal_2();                                            } /* DB   ED          */
  3342. OP(ed,2c) { illegal_2();                                            } /* DB   ED          */
  3343. OP(ed,2d) { illegal_2();                                            } /* DB   ED          */
  3344. OP(ed,2e) { illegal_2();                                            } /* DB   ED          */
  3345. OP(ed,2f) { illegal_2();                                            } /* DB   ED          */
  3346.  
  3347. OP(ed,30) { illegal_2();                                            } /* DB   ED          */
  3348. OP(ed,31) { illegal_2();                                            } /* DB   ED          */
  3349. OP(ed,32) { illegal_2();                                            } /* DB   ED          */
  3350. OP(ed,33) { illegal_2();                                            } /* DB   ED          */
  3351. OP(ed,34) { illegal_2();                                            } /* DB   ED          */
  3352. OP(ed,35) { illegal_2();                                            } /* DB   ED          */
  3353. OP(ed,36) { illegal_2();                                            } /* DB   ED          */
  3354. OP(ed,37) { illegal_2();                                            } /* DB   ED          */
  3355.  
  3356. OP(ed,38) { illegal_2();                                            } /* DB   ED          */
  3357. OP(ed,39) { illegal_2();                                            } /* DB   ED          */
  3358. OP(ed,3a) { illegal_2();                                            } /* DB   ED          */
  3359. OP(ed,3b) { illegal_2();                                            } /* DB   ED          */
  3360. OP(ed,3c) { illegal_2();                                            } /* DB   ED          */
  3361. OP(ed,3d) { illegal_2();                                            } /* DB   ED          */
  3362. OP(ed,3e) { illegal_2();                                            } /* DB   ED          */
  3363. OP(ed,3f) { illegal_2();                                            } /* DB   ED          */
  3364.  
  3365. OP(ed,40) { _B = IN(_BC); _F = (_F & CF) | SZP[_B];                 } /* IN   B,(C)       */
  3366. OP(ed,41) { OUT(_BC,_B);                                            } /* OUT  (C),B       */
  3367. OP(ed,42) { SBC16( BC );                                            } /* SBC  HL,BC       */
  3368. OP(ed,43) { EA = ARG16(); WM16( EA, &Z80.BC );                        } /* LD   (w),BC      */
  3369. OP(ed,44) { NEG;                                                    } /* NEG              */
  3370. OP(ed,45) { RETN;                                                    } /* RETN;              */
  3371. OP(ed,46) { _IM = 0;                                                } /* IM   0           */
  3372. OP(ed,47) { LD_I_A;                                                 } /* LD   I,A          */
  3373.  
  3374. OP(ed,48) { _C = IN(_BC); _F = (_F & CF) | SZP[_C];                 } /* IN   C,(C)       */
  3375. OP(ed,49) { OUT(_BC,_C);                                            } /* OUT  (C),C       */
  3376. OP(ed,4a) { ADC16( BC );                                            } /* ADC  HL,BC       */
  3377. OP(ed,4b) { EA = ARG16(); RM16( EA, &Z80.BC );                        } /* LD   BC,(w)      */
  3378. OP(ed,4c) { NEG;                                                    } /* NEG              */
  3379. OP(ed,4d) { RETI;                                                    } /* RETI              */
  3380. OP(ed,4e) { _IM = 0;                                                } /* IM   0           */
  3381. OP(ed,4f) { LD_R_A;                                                 } /* LD   R,A          */
  3382.  
  3383. OP(ed,50) { _D = IN(_BC); _F = (_F & CF) | SZP[_D];                 } /* IN   D,(C)       */
  3384. OP(ed,51) { OUT(_BC,_D);                                            } /* OUT  (C),D       */
  3385. OP(ed,52) { SBC16( DE );                                            } /* SBC  HL,DE       */
  3386. OP(ed,53) { EA = ARG16(); WM16( EA, &Z80.DE );                        } /* LD   (w),DE      */
  3387. OP(ed,54) { NEG;                                                    } /* NEG              */
  3388. OP(ed,55) { RETN;                                                    } /* RETN;              */
  3389. OP(ed,56) { _IM = 1;                                                } /* IM   1           */
  3390. OP(ed,57) { LD_A_I;                                                 } /* LD   A,I          */
  3391.  
  3392. OP(ed,58) { _E = IN(_BC); _F = (_F & CF) | SZP[_E];                 } /* IN   E,(C)       */
  3393. OP(ed,59) { OUT(_BC,_E);                                            } /* OUT  (C),E       */
  3394. OP(ed,5a) { ADC16( DE );                                            } /* ADC  HL,DE       */
  3395. OP(ed,5b) { EA = ARG16(); RM16( EA, &Z80.DE );                        } /* LD   DE,(w)      */
  3396. OP(ed,5c) { NEG;                                                    } /* NEG              */
  3397. OP(ed,5d) { RETI;                                                    } /* RETI              */
  3398. OP(ed,5e) { _IM = 2;                                                } /* IM   2           */
  3399. OP(ed,5f) { LD_A_R;                                                 } /* LD   A,R          */
  3400.  
  3401. OP(ed,60) { _H = IN(_BC); _F = (_F & CF) | SZP[_H];                 } /* IN   H,(C)       */
  3402. OP(ed,61) { OUT(_BC,_H);                                            } /* OUT  (C),H       */
  3403. OP(ed,62) { SBC16( HL );                                            } /* SBC  HL,HL       */
  3404. OP(ed,63) { EA = ARG16(); WM16( EA, &Z80.HL );                        } /* LD   (w),HL      */
  3405. OP(ed,64) { NEG;                                                    } /* NEG              */
  3406. OP(ed,65) { RETN;                                                    } /* RETN;              */
  3407. OP(ed,66) { _IM = 0;                                                } /* IM   0           */
  3408. OP(ed,67) { RRD;                                                    } /* RRD  (HL)          */
  3409.  
  3410. OP(ed,68) { _L = IN(_BC); _F = (_F & CF) | SZP[_L];                 } /* IN   L,(C)       */
  3411. OP(ed,69) { OUT(_BC,_L);                                            } /* OUT  (C),L       */
  3412. OP(ed,6a) { ADC16( HL );                                            } /* ADC  HL,HL       */
  3413. OP(ed,6b) { EA = ARG16(); RM16( EA, &Z80.HL );                        } /* LD   HL,(w)      */
  3414. OP(ed,6c) { NEG;                                                    } /* NEG              */
  3415. OP(ed,6d) { RETI;                                                    } /* RETI              */
  3416. OP(ed,6e) { _IM = 0;                                                } /* IM   0           */
  3417. OP(ed,6f) { RLD;                                                    } /* RLD  (HL)          */
  3418.  
  3419. OP(ed,70) { UINT8 res = IN(_BC); _F = (_F & CF) | SZP[res];         } /* IN   0,(C)       */
  3420. OP(ed,71) { OUT(_BC,0);                                             } /* OUT  (C),0       */
  3421. OP(ed,72) { SBC16( SP );                                            } /* SBC  HL,SP       */
  3422. OP(ed,73) { EA = ARG16(); WM16( EA, &Z80.SP );                        } /* LD   (w),SP      */
  3423. OP(ed,74) { NEG;                                                    } /* NEG              */
  3424. OP(ed,75) { RETN;                                                    } /* RETN;              */
  3425. OP(ed,76) { _IM = 1;                                                } /* IM   1           */
  3426. OP(ed,77) { illegal_2();                                            } /* DB   ED,77       */
  3427.  
  3428. OP(ed,78) { _A = IN(_BC); _F = (_F & CF) | SZP[_A];                 } /* IN   E,(C)       */
  3429. OP(ed,79) { OUT(_BC,_A);                                            } /* OUT  (C),E       */
  3430. OP(ed,7a) { ADC16( SP );                                            } /* ADC  HL,SP       */
  3431. OP(ed,7b) { EA = ARG16(); RM16( EA, &Z80.SP );                        } /* LD   SP,(w)      */
  3432. OP(ed,7c) { NEG;                                                    } /* NEG              */
  3433. OP(ed,7d) { RETI;                                                    } /* RETI              */
  3434. OP(ed,7e) { _IM = 2;                                                } /* IM   2           */
  3435. OP(ed,7f) { illegal_2();                                            } /* DB   ED,7F       */
  3436.  
  3437. OP(ed,80) { illegal_2();                                            } /* DB   ED          */
  3438. OP(ed,81) { illegal_2();                                            } /* DB   ED          */
  3439. OP(ed,82) { illegal_2();                                            } /* DB   ED          */
  3440. OP(ed,83) { illegal_2();                                            } /* DB   ED          */
  3441. OP(ed,84) { illegal_2();                                            } /* DB   ED          */
  3442. OP(ed,85) { illegal_2();                                            } /* DB   ED          */
  3443. OP(ed,86) { illegal_2();                                            } /* DB   ED          */
  3444. OP(ed,87) { illegal_2();                                            } /* DB   ED          */
  3445.  
  3446. OP(ed,88) { illegal_2();                                            } /* DB   ED          */
  3447. OP(ed,89) { illegal_2();                                            } /* DB   ED          */
  3448. OP(ed,8a) { illegal_2();                                            } /* DB   ED          */
  3449. OP(ed,8b) { illegal_2();                                            } /* DB   ED          */
  3450. OP(ed,8c) { illegal_2();                                            } /* DB   ED          */
  3451. OP(ed,8d) { illegal_2();                                            } /* DB   ED          */
  3452. OP(ed,8e) { illegal_2();                                            } /* DB   ED          */
  3453. OP(ed,8f) { illegal_2();                                            } /* DB   ED          */
  3454.  
  3455. OP(ed,90) { illegal_2();                                            } /* DB   ED          */
  3456. OP(ed,91) { illegal_2();                                            } /* DB   ED          */
  3457. OP(ed,92) { illegal_2();                                            } /* DB   ED          */
  3458. OP(ed,93) { illegal_2();                                            } /* DB   ED          */
  3459. OP(ed,94) { illegal_2();                                            } /* DB   ED          */
  3460. OP(ed,95) { illegal_2();                                            } /* DB   ED          */
  3461. OP(ed,96) { illegal_2();                                            } /* DB   ED          */
  3462. OP(ed,97) { illegal_2();                                            } /* DB   ED          */
  3463.  
  3464. OP(ed,98) { illegal_2();                                            } /* DB   ED          */
  3465. OP(ed,99) { illegal_2();                                            } /* DB   ED          */
  3466. OP(ed,9a) { illegal_2();                                            } /* DB   ED          */
  3467. OP(ed,9b) { illegal_2();                                            } /* DB   ED          */
  3468. OP(ed,9c) { illegal_2();                                            } /* DB   ED          */
  3469. OP(ed,9d) { illegal_2();                                            } /* DB   ED          */
  3470. OP(ed,9e) { illegal_2();                                            } /* DB   ED          */
  3471. OP(ed,9f) { illegal_2();                                            } /* DB   ED          */
  3472.  
  3473. OP(ed,a0) { LDI;                                                    } /* LDI              */
  3474. OP(ed,a1) { CPI;                                                    } /* CPI              */
  3475. OP(ed,a2) { INI;                                                    } /* INI              */
  3476. OP(ed,a3) { OUTI;                                                    } /* OUTI              */
  3477. OP(ed,a4) { illegal_2();                                            } /* DB   ED          */
  3478. OP(ed,a5) { illegal_2();                                            } /* DB   ED          */
  3479. OP(ed,a6) { illegal_2();                                            } /* DB   ED          */
  3480. OP(ed,a7) { illegal_2();                                            } /* DB   ED          */
  3481.  
  3482. OP(ed,a8) { LDD;                                                    } /* LDD              */
  3483. OP(ed,a9) { CPD;                                                    } /* CPD              */
  3484. OP(ed,aa) { IND;                                                    } /* IND              */
  3485. OP(ed,ab) { OUTD;                                                    } /* OUTD              */
  3486. OP(ed,ac) { illegal_2();                                            } /* DB   ED          */
  3487. OP(ed,ad) { illegal_2();                                            } /* DB   ED          */
  3488. OP(ed,ae) { illegal_2();                                            } /* DB   ED          */
  3489. OP(ed,af) { illegal_2();                                            } /* DB   ED          */
  3490.  
  3491. OP(ed,b0) { LDIR;                                                    } /* LDIR              */
  3492. OP(ed,b1) { CPIR;                                                    } /* CPIR              */
  3493. OP(ed,b2) { INIR;                                                    } /* INIR              */
  3494. OP(ed,b3) { OTIR;                                                    } /* OTIR              */
  3495. OP(ed,b4) { illegal_2();                                            } /* DB   ED          */
  3496. OP(ed,b5) { illegal_2();                                            } /* DB   ED          */
  3497. OP(ed,b6) { illegal_2();                                            } /* DB   ED          */
  3498. OP(ed,b7) { illegal_2();                                            } /* DB   ED          */
  3499.  
  3500. OP(ed,b8) { LDDR;                                                    } /* LDDR              */
  3501. OP(ed,b9) { CPDR;                                                    } /* CPDR              */
  3502. OP(ed,ba) { INDR;                                                    } /* INDR              */
  3503. OP(ed,bb) { OTDR;                                                    } /* OTDR              */
  3504. OP(ed,bc) { illegal_2();                                            } /* DB   ED          */
  3505. OP(ed,bd) { illegal_2();                                            } /* DB   ED          */
  3506. OP(ed,be) { illegal_2();                                            } /* DB   ED          */
  3507. OP(ed,bf) { illegal_2();                                            } /* DB   ED          */
  3508.  
  3509. OP(ed,c0) { illegal_2();                                            } /* DB   ED          */
  3510. OP(ed,c1) { illegal_2();                                            } /* DB   ED          */
  3511. OP(ed,c2) { illegal_2();                                            } /* DB   ED          */
  3512. OP(ed,c3) { illegal_2();                                            } /* DB   ED          */
  3513. OP(ed,c4) { illegal_2();                                            } /* DB   ED          */
  3514. OP(ed,c5) { illegal_2();                                            } /* DB   ED          */
  3515. OP(ed,c6) { illegal_2();                                            } /* DB   ED          */
  3516. OP(ed,c7) { illegal_2();                                            } /* DB   ED          */
  3517.  
  3518. OP(ed,c8) { illegal_2();                                            } /* DB   ED          */
  3519. OP(ed,c9) { illegal_2();                                            } /* DB   ED          */
  3520. OP(ed,ca) { illegal_2();                                            } /* DB   ED          */
  3521. OP(ed,cb) { illegal_2();                                            } /* DB   ED          */
  3522. OP(ed,cc) { illegal_2();                                            } /* DB   ED          */
  3523. OP(ed,cd) { illegal_2();                                            } /* DB   ED          */
  3524. OP(ed,ce) { illegal_2();                                            } /* DB   ED          */
  3525. OP(ed,cf) { illegal_2();                                            } /* DB   ED          */
  3526.  
  3527. OP(ed,d0) { illegal_2();                                            } /* DB   ED          */
  3528. OP(ed,d1) { illegal_2();                                            } /* DB   ED          */
  3529. OP(ed,d2) { illegal_2();                                            } /* DB   ED          */
  3530. OP(ed,d3) { illegal_2();                                            } /* DB   ED          */
  3531. OP(ed,d4) { illegal_2();                                            } /* DB   ED          */
  3532. OP(ed,d5) { illegal_2();                                            } /* DB   ED          */
  3533. OP(ed,d6) { illegal_2();                                            } /* DB   ED          */
  3534. OP(ed,d7) { illegal_2();                                            } /* DB   ED          */
  3535.  
  3536. OP(ed,d8) { illegal_2();                                            } /* DB   ED          */
  3537. OP(ed,d9) { illegal_2();                                            } /* DB   ED          */
  3538. OP(ed,da) { illegal_2();                                            } /* DB   ED          */
  3539. OP(ed,db) { illegal_2();                                            } /* DB   ED          */
  3540. OP(ed,dc) { illegal_2();                                            } /* DB   ED          */
  3541. OP(ed,dd) { illegal_2();                                            } /* DB   ED          */
  3542. OP(ed,de) { illegal_2();                                            } /* DB   ED          */
  3543. OP(ed,df) { illegal_2();                                            } /* DB   ED          */
  3544.  
  3545. OP(ed,e0) { illegal_2();                                            } /* DB   ED          */
  3546. OP(ed,e1) { illegal_2();                                            } /* DB   ED          */
  3547. OP(ed,e2) { illegal_2();                                            } /* DB   ED          */
  3548. OP(ed,e3) { illegal_2();                                            } /* DB   ED          */
  3549. OP(ed,e4) { illegal_2();                                            } /* DB   ED          */
  3550. OP(ed,e5) { illegal_2();                                            } /* DB   ED          */
  3551. OP(ed,e6) { illegal_2();                                            } /* DB   ED          */
  3552. OP(ed,e7) { illegal_2();                                            } /* DB   ED          */
  3553.  
  3554. OP(ed,e8) { illegal_2();                                            } /* DB   ED          */
  3555. OP(ed,e9) { illegal_2();                                            } /* DB   ED          */
  3556. OP(ed,ea) { illegal_2();                                            } /* DB   ED          */
  3557. OP(ed,eb) { illegal_2();                                            } /* DB   ED          */
  3558. OP(ed,ec) { illegal_2();                                            } /* DB   ED          */
  3559. OP(ed,ed) { illegal_2();                                            } /* DB   ED          */
  3560. OP(ed,ee) { illegal_2();                                            } /* DB   ED          */
  3561. OP(ed,ef) { illegal_2();                                            } /* DB   ED          */
  3562.  
  3563. OP(ed,f0) { illegal_2();                                            } /* DB   ED          */
  3564. OP(ed,f1) { illegal_2();                                            } /* DB   ED          */
  3565. OP(ed,f2) { illegal_2();                                            } /* DB   ED          */
  3566. OP(ed,f3) { illegal_2();                                            } /* DB   ED          */
  3567. OP(ed,f4) { illegal_2();                                            } /* DB   ED          */
  3568. OP(ed,f5) { illegal_2();                                            } /* DB   ED          */
  3569. OP(ed,f6) { illegal_2();                                            } /* DB   ED          */
  3570. OP(ed,f7) { illegal_2();                                            } /* DB   ED          */
  3571.  
  3572. OP(ed,f8) { illegal_2();                                            } /* DB   ED          */
  3573. OP(ed,f9) { illegal_2();                                            } /* DB   ED          */
  3574. OP(ed,fa) { illegal_2();                                            } /* DB   ED          */
  3575. OP(ed,fb) { illegal_2();                                            } /* DB   ED          */
  3576. OP(ed,fc) { illegal_2();                                            } /* DB   ED          */
  3577. OP(ed,fd) { illegal_2();                                            } /* DB   ED          */
  3578. OP(ed,fe) { illegal_2();                                            } /* DB   ED          */
  3579. OP(ed,ff) { illegal_2();                                            } /* DB   ED          */
  3580.  
  3581. #if TIME_LOOP_HACKS
  3582.  
  3583. #define CHECK_BC_LOOP                                               \
  3584. if( _BC > 1 && _PCD < 0xfffc ) {                                    \
  3585.     UINT8 op1 = cpu_readop(_PCD);                                    \
  3586.     UINT8 op2 = cpu_readop(_PCD+1);                                 \
  3587.     if( (op1==0x78 && op2==0xb1) || (op1==0x79 && op2==0xb0) )        \
  3588.     {                                                                \
  3589.         UINT8 op3 = cpu_readop(_PCD+2);                             \
  3590.         UINT8 op4 = cpu_readop(_PCD+3);                             \
  3591.         if( op3==0x20 && op4==0xfb )                                \
  3592.         {                                                            \
  3593.             while( _BC > 0 && z80_ICount > 4+4+12+6 )                \
  3594.             {                                                        \
  3595.                 BURNODD( 4+4+12+6, 4, 4+4+12+6 );                    \
  3596.                 _BC--;                                                \
  3597.             }                                                        \
  3598.         }                                                            \
  3599.         else                                                        \
  3600.         if( op3 == 0xc2 )                                            \
  3601.         {                                                            \
  3602.             UINT8 ad1 = cpu_readop_arg(_PCD+3);                     \
  3603.             UINT8 ad2 = cpu_readop_arg(_PCD+4);                     \
  3604.             if( (ad1 + 256 * ad2) == (_PCD - 1) )                    \
  3605.             {                                                        \
  3606.                 while( _BC > 0 && z80_ICount > 4+4+10+6 )            \
  3607.                 {                                                    \
  3608.                     BURNODD( 4+4+10+6, 4, 4+4+10+6 );                \
  3609.                     _BC--;                                            \
  3610.                 }                                                    \
  3611.             }                                                        \
  3612.         }                                                            \
  3613.     }                                                                \
  3614. }
  3615.  
  3616. #define CHECK_DE_LOOP                                               \
  3617. if( _DE > 1 && _PCD < 0xfffc ) {                                    \
  3618.     UINT8 op1 = cpu_readop(_PCD);                                    \
  3619.     UINT8 op2 = cpu_readop(_PCD+1);                                 \
  3620.     if( (op1==0x7a && op2==0xb3) || (op1==0x7b && op2==0xb2) )        \
  3621.     {                                                                \
  3622.         UINT8 op3 = cpu_readop(_PCD+2);                             \
  3623.         UINT8 op4 = cpu_readop(_PCD+3);                             \
  3624.         if( op3==0x20 && op4==0xfb )                                \
  3625.         {                                                            \
  3626.             while( _DE > 0 && z80_ICount > 4+4+12+6 )                \
  3627.             {                                                        \
  3628.                 BURNODD( 4+4+12+6, 4, 4+4+12+6 );                    \
  3629.                 _DE--;                                                \
  3630.             }                                                        \
  3631.         }                                                            \
  3632.         else                                                        \
  3633.         if( op3==0xc2 )                                             \
  3634.         {                                                            \
  3635.             UINT8 ad1 = cpu_readop_arg(_PCD+3);                     \
  3636.             UINT8 ad2 = cpu_readop_arg(_PCD+4);                     \
  3637.             if( (ad1 + 256 * ad2) == (_PCD - 1) )                    \
  3638.             {                                                        \
  3639.                 while( _DE > 0 && z80_ICount > 4+4+10+6 )            \
  3640.                 {                                                    \
  3641.                     BURNODD( 4+4+10+6, 4, 4+4+10+6 );                \
  3642.                     _DE--;                                            \
  3643.                 }                                                    \
  3644.             }                                                        \
  3645.         }                                                            \
  3646.     }                                                                \
  3647. }
  3648.  
  3649. #define CHECK_HL_LOOP                                               \
  3650. if( _HL > 1 && _PCD < 0xfffc ) {                                    \
  3651.     UINT8 op1 = cpu_readop(_PCD);                                    \
  3652.     UINT8 op2 = cpu_readop(_PCD+1);                                 \
  3653.     if( (op1==0x7c && op2==0xb5) || (op1==0x7d && op2==0xb4) )        \
  3654.     {                                                                \
  3655.         UINT8 op3 = cpu_readop(_PCD+2);                             \
  3656.         UINT8 op4 = cpu_readop(_PCD+3);                             \
  3657.         if( op3==0x20 && op4==0xfb )                                \
  3658.         {                                                            \
  3659.             while( _HL > 0 && z80_ICount > 4+4+12+6 )                \
  3660.             {                                                        \
  3661.                 BURNODD( 4+4+12+6, 4, 4+4+12+6 );                    \
  3662.                 _HL--;                                                \
  3663.             }                                                        \
  3664.         }                                                            \
  3665.         else                                                        \
  3666.         if( op3==0xc2 )                                             \
  3667.         {                                                            \
  3668.             UINT8 ad1 = cpu_readop_arg(_PCD+3);                     \
  3669.             UINT8 ad2 = cpu_readop_arg(_PCD+4);                     \
  3670.             if( (ad1 + 256 * ad2) == (_PCD - 1) )                    \
  3671.             {                                                        \
  3672.                 while( _HL > 0 && z80_ICount > 4+4+10+6 )            \
  3673.                 {                                                    \
  3674.                     BURNODD( 4+4+10+6, 4, 4+4+10+6 );                \
  3675.                     _HL--;                                            \
  3676.                 }                                                    \
  3677.             }                                                        \
  3678.         }                                                            \
  3679.     }                                                                \
  3680. }
  3681.  
  3682. #else
  3683.  
  3684. #define CHECK_BC_LOOP
  3685. #define CHECK_DE_LOOP
  3686. #define CHECK_HL_LOOP
  3687.  
  3688. #endif
  3689.  
  3690. /**********************************************************
  3691.  * main opcodes
  3692.  **********************************************************/
  3693. OP(op,00) {                                                         } /* NOP              */
  3694. OP(op,01) { _BC = ARG16();                                            } /* LD   BC,w          */
  3695. OP(op,02) { WM( _BC, _A );                                            } /* LD   (BC),A      */
  3696. OP(op,03) { _BC++;                                                    } /* INC  BC          */
  3697. OP(op,04) { _B = INC(_B);                                            } /* INC  B           */
  3698. OP(op,05) { _B = DEC(_B);                                            } /* DEC  B           */
  3699. OP(op,06) { _B = ARG();                                             } /* LD   B,n          */
  3700. OP(op,07) { RLCA;                                                    } /* RLCA              */
  3701.  
  3702. OP(op,08) { EX_AF;                                                    } /* EX   AF,AF'      */
  3703. OP(op,09) { ADD16(HL,BC);                                            } /* ADD  HL,BC       */
  3704. OP(op,0a) { _A = RM(_BC);                                            } /* LD   A,(BC)      */
  3705. OP(op,0b) { _BC--; CHECK_BC_LOOP;                                    } /* DEC  BC          */
  3706. OP(op,0c) { _C = INC(_C);                                            } /* INC  C           */
  3707. OP(op,0d) { _C = DEC(_C);                                            } /* DEC  C           */
  3708. OP(op,0e) { _C = ARG();                                             } /* LD   C,n          */
  3709. OP(op,0f) { RRCA;                                                    } /* RRCA              */
  3710.  
  3711. OP(op,10) { _B--; JR_COND(_B);                                        } /* DJNZ o           */
  3712. OP(op,11) { _DE = ARG16();                                            } /* LD   DE,w          */
  3713. OP(op,12) { WM( _DE, _A );                                            } /* LD   (DE),A      */
  3714. OP(op,13) { _DE++;                                                    } /* INC  DE          */
  3715. OP(op,14) { _D = INC(_D);                                            } /* INC  D           */
  3716. OP(op,15) { _D = DEC(_D);                                            } /* DEC  D           */
  3717. OP(op,16) { _D = ARG();                                             } /* LD   D,n          */
  3718. OP(op,17) { RLA;                                                    } /* RLA              */
  3719.  
  3720. OP(op,18) { JR();                                                    } /* JR   o           */
  3721. OP(op,19) { ADD16(HL,DE);                                            } /* ADD  HL,DE       */
  3722. OP(op,1a) { _A = RM(_DE);                                            } /* LD   A,(DE)      */
  3723. OP(op,1b) { _DE--; CHECK_DE_LOOP;                                    } /* DEC  DE          */
  3724. OP(op,1c) { _E = INC(_E);                                            } /* INC  E           */
  3725. OP(op,1d) { _E = DEC(_E);                                            } /* DEC  E           */
  3726. OP(op,1e) { _E = ARG();                                             } /* LD   E,n          */
  3727. OP(op,1f) { RRA;                                                    } /* RRA              */
  3728.  
  3729. OP(op,20) { JR_COND( !(_F & ZF) );                                    } /* JR   NZ,o          */
  3730. OP(op,21) { _HL = ARG16();                                            } /* LD   HL,w          */
  3731. OP(op,22) { EA = ARG16(); WM16( EA, &Z80.HL );                        } /* LD   (w),HL      */
  3732. OP(op,23) { _HL++;                                                    } /* INC  HL          */
  3733. OP(op,24) { _H = INC(_H);                                            } /* INC  H           */
  3734. OP(op,25) { _H = DEC(_H);                                            } /* DEC  H           */
  3735. OP(op,26) { _H = ARG();                                             } /* LD   H,n          */
  3736. OP(op,27) { DAA;                                                    } /* DAA              */
  3737.  
  3738. OP(op,28) { JR_COND( _F & ZF );                                     } /* JR   Z,o          */
  3739. OP(op,29) { ADD16(HL,HL);                                            } /* ADD  HL,HL       */
  3740. OP(op,2a) { EA = ARG16(); RM16( EA, &Z80.HL );                        } /* LD   HL,(w)      */
  3741. OP(op,2b) { _HL--; CHECK_HL_LOOP;                                    } /* DEC  HL          */
  3742. OP(op,2c) { _L = INC(_L);                                            } /* INC  L           */
  3743. OP(op,2d) { _L = DEC(_L);                                            } /* DEC  L           */
  3744. OP(op,2e) { _L = ARG();                                             } /* LD   L,n          */
  3745. OP(op,2f) { _A ^= 0xff; _F = (_F&(SF|ZF|PF|CF))|HF|NF|(_A&(YF|XF)); } /* CPL              */
  3746.  
  3747. OP(op,30) { JR_COND( !(_F & CF) );                                    } /* JR   NC,o          */
  3748. OP(op,31) { _SP = ARG16();                                            } /* LD   SP,w          */
  3749. OP(op,32) { EA = ARG16(); WM( EA, _A );                             } /* LD   (w),A       */
  3750. OP(op,33) { _SP++;                                                    } /* INC  SP          */
  3751. OP(op,34) { WM( _HL, INC(RM(_HL)) );                                } /* INC  (HL)          */
  3752. OP(op,35) { WM( _HL, DEC(RM(_HL)) );                                } /* DEC  (HL)          */
  3753. OP(op,36) { WM( _HL, ARG() );                                        } /* LD   (HL),n      */
  3754. OP(op,37) { _F = (_F & (SF|ZF|PF)) | CF | (_A & (YF|XF));            } /* SCF              */
  3755.  
  3756. OP(op,38) { JR_COND( _F & CF );                                     } /* JR   C,o          */
  3757. OP(op,39) { ADD16(HL,SP);                                            } /* ADD  HL,SP       */
  3758. OP(op,3a) { EA = ARG16(); _A = RM( EA );                            } /* LD   A,(w)       */
  3759. OP(op,3b) { _SP--;                                                    } /* DEC  SP          */
  3760. OP(op,3c) { _A = INC(_A);                                            } /* INC  A           */
  3761. OP(op,3d) { _A = DEC(_A);                                            } /* DEC  A           */
  3762. OP(op,3e) { _A = ARG();                                             } /* LD   A,n          */
  3763. OP(op,3f) { _F = ((_F&(SF|ZF|PF|CF))|((_F&CF)<<4)|(_A&(YF|XF)))^CF; } /* CCF              */
  3764. //OP(op,3f) { _F = ((_F & ~(HF|NF)) | ((_F & CF)<<4)) ^ CF;           } /* CCF                */
  3765.  
  3766. OP(op,40) {                                                         } /* LD   B,B          */
  3767. OP(op,41) { _B = _C;                                                } /* LD   B,C          */
  3768. OP(op,42) { _B = _D;                                                } /* LD   B,D          */
  3769. OP(op,43) { _B = _E;                                                } /* LD   B,E          */
  3770. OP(op,44) { _B = _H;                                                } /* LD   B,H          */
  3771. OP(op,45) { _B = _L;                                                } /* LD   B,L          */
  3772. OP(op,46) { _B = RM(_HL);                                            } /* LD   B,(HL)      */
  3773. OP(op,47) { _B = _A;                                                } /* LD   B,A          */
  3774.  
  3775. OP(op,48) { _C = _B;                                                } /* LD   C,B          */
  3776. OP(op,49) {                                                         } /* LD   C,C          */
  3777. OP(op,4a) { _C = _D;                                                } /* LD   C,D          */
  3778. OP(op,4b) { _C = _E;                                                } /* LD   C,E          */
  3779. OP(op,4c) { _C = _H;                                                } /* LD   C,H          */
  3780. OP(op,4d) { _C = _L;                                                } /* LD   C,L          */
  3781. OP(op,4e) { _C = RM(_HL);                                            } /* LD   C,(HL)      */
  3782. OP(op,4f) { _C = _A;                                                } /* LD   C,A          */
  3783.  
  3784. OP(op,50) { _D = _B;                                                } /* LD   D,B          */
  3785. OP(op,51) { _D = _C;                                                } /* LD   D,C          */
  3786. OP(op,52) {                                                         } /* LD   D,D          */
  3787. OP(op,53) { _D = _E;                                                } /* LD   D,E          */
  3788. OP(op,54) { _D = _H;                                                } /* LD   D,H          */
  3789. OP(op,55) { _D = _L;                                                } /* LD   D,L          */
  3790. OP(op,56) { _D = RM(_HL);                                            } /* LD   D,(HL)      */
  3791. OP(op,57) { _D = _A;                                                } /* LD   D,A          */
  3792.  
  3793. OP(op,58) { _E = _B;                                                } /* LD   E,B          */
  3794. OP(op,59) { _E = _C;                                                } /* LD   E,C          */
  3795. OP(op,5a) { _E = _D;                                                } /* LD   E,D          */
  3796. OP(op,5b) {                                                         } /* LD   E,E          */
  3797. OP(op,5c) { _E = _H;                                                } /* LD   E,H          */
  3798. OP(op,5d) { _E = _L;                                                } /* LD   E,L          */
  3799. OP(op,5e) { _E = RM(_HL);                                            } /* LD   E,(HL)      */
  3800. OP(op,5f) { _E = _A;                                                } /* LD   E,A          */
  3801.  
  3802. OP(op,60) { _H = _B;                                                } /* LD   H,B          */
  3803. OP(op,61) { _H = _C;                                                } /* LD   H,C          */
  3804. OP(op,62) { _H = _D;                                                } /* LD   H,D          */
  3805. OP(op,63) { _H = _E;                                                } /* LD   H,E          */
  3806. OP(op,64) {                                                         } /* LD   H,H          */
  3807. OP(op,65) { _H = _L;                                                } /* LD   H,L          */
  3808. OP(op,66) { _H = RM(_HL);                                            } /* LD   H,(HL)      */
  3809. OP(op,67) { _H = _A;                                                } /* LD   H,A          */
  3810.  
  3811. OP(op,68) { _L = _B;                                                } /* LD   L,B          */
  3812. OP(op,69) { _L = _C;                                                } /* LD   L,C          */
  3813. OP(op,6a) { _L = _D;                                                } /* LD   L,D          */
  3814. OP(op,6b) { _L = _E;                                                } /* LD   L,E          */
  3815. OP(op,6c) { _L = _H;                                                } /* LD   L,H          */
  3816. OP(op,6d) {                                                         } /* LD   L,L          */
  3817. OP(op,6e) { _L = RM(_HL);                                            } /* LD   L,(HL)      */
  3818. OP(op,6f) { _L = _A;                                                } /* LD   L,A          */
  3819.  
  3820. OP(op,70) { WM( _HL, _B );                                            } /* LD   (HL),B      */
  3821. OP(op,71) { WM( _HL, _C );                                            } /* LD   (HL),C      */
  3822. OP(op,72) { WM( _HL, _D );                                            } /* LD   (HL),D      */
  3823. OP(op,73) { WM( _HL, _E );                                            } /* LD   (HL),E      */
  3824. OP(op,74) { WM( _HL, _H );                                            } /* LD   (HL),H      */
  3825. OP(op,75) { WM( _HL, _L );                                            } /* LD   (HL),L      */
  3826. OP(op,76) { ENTER_HALT;                                             } /* HALT              */
  3827. OP(op,77) { WM( _HL, _A );                                            } /* LD   (HL),A      */
  3828.  
  3829. OP(op,78) { _A = _B;                                                } /* LD   A,B          */
  3830. OP(op,79) { _A = _C;                                                } /* LD   A,C          */
  3831. OP(op,7a) { _A = _D;                                                } /* LD   A,D          */
  3832. OP(op,7b) { _A = _E;                                                } /* LD   A,E          */
  3833. OP(op,7c) { _A = _H;                                                } /* LD   A,H          */
  3834. OP(op,7d) { _A = _L;                                                } /* LD   A,L          */
  3835. OP(op,7e) { _A = RM(_HL);                                            } /* LD   A,(HL)      */
  3836. OP(op,7f) {                                                         } /* LD   A,A          */
  3837.  
  3838. OP(op,80) { ADD(_B);                                                } /* ADD  A,B          */
  3839. OP(op,81) { ADD(_C);                                                } /* ADD  A,C          */
  3840. OP(op,82) { ADD(_D);                                                } /* ADD  A,D          */
  3841. OP(op,83) { ADD(_E);                                                } /* ADD  A,E          */
  3842. OP(op,84) { ADD(_H);                                                } /* ADD  A,H          */
  3843. OP(op,85) { ADD(_L);                                                } /* ADD  A,L          */
  3844. OP(op,86) { ADD(RM(_HL));                                            } /* ADD  A,(HL)      */
  3845. OP(op,87) { ADD(_A);                                                } /* ADD  A,A          */
  3846.  
  3847. OP(op,88) { ADC(_B);                                                } /* ADC  A,B          */
  3848. OP(op,89) { ADC(_C);                                                } /* ADC  A,C          */
  3849. OP(op,8a) { ADC(_D);                                                } /* ADC  A,D          */
  3850. OP(op,8b) { ADC(_E);                                                } /* ADC  A,E          */
  3851. OP(op,8c) { ADC(_H);                                                } /* ADC  A,H          */
  3852. OP(op,8d) { ADC(_L);                                                } /* ADC  A,L          */
  3853. OP(op,8e) { ADC(RM(_HL));                                            } /* ADC  A,(HL)      */
  3854. OP(op,8f) { ADC(_A);                                                } /* ADC  A,A          */
  3855.  
  3856. OP(op,90) { SUB(_B);                                                } /* SUB  B           */
  3857. OP(op,91) { SUB(_C);                                                } /* SUB  C           */
  3858. OP(op,92) { SUB(_D);                                                } /* SUB  D           */
  3859. OP(op,93) { SUB(_E);                                                } /* SUB  E           */
  3860. OP(op,94) { SUB(_H);                                                } /* SUB  H           */
  3861. OP(op,95) { SUB(_L);                                                } /* SUB  L           */
  3862. OP(op,96) { SUB(RM(_HL));                                            } /* SUB  (HL)          */
  3863. OP(op,97) { SUB(_A);                                                } /* SUB  A           */
  3864.  
  3865. OP(op,98) { SBC(_B);                                                } /* SBC  A,B          */
  3866. OP(op,99) { SBC(_C);                                                } /* SBC  A,C          */
  3867. OP(op,9a) { SBC(_D);                                                } /* SBC  A,D          */
  3868. OP(op,9b) { SBC(_E);                                                } /* SBC  A,E          */
  3869. OP(op,9c) { SBC(_H);                                                } /* SBC  A,H          */
  3870. OP(op,9d) { SBC(_L);                                                } /* SBC  A,L          */
  3871. OP(op,9e) { SBC(RM(_HL));                                            } /* SBC  A,(HL)      */
  3872. OP(op,9f) { SBC(_A);                                                } /* SBC  A,A          */
  3873.  
  3874. OP(op,a0) { AND(_B);                                                } /* AND  B           */
  3875. OP(op,a1) { AND(_C);                                                } /* AND  C           */
  3876. OP(op,a2) { AND(_D);                                                } /* AND  D           */
  3877. OP(op,a3) { AND(_E);                                                } /* AND  E           */
  3878. OP(op,a4) { AND(_H);                                                } /* AND  H           */
  3879. OP(op,a5) { AND(_L);                                                } /* AND  L           */
  3880. OP(op,a6) { AND(RM(_HL));                                            } /* AND  (HL)          */
  3881. OP(op,a7) { AND(_A);                                                } /* AND  A           */
  3882.  
  3883. OP(op,a8) { XOR(_B);                                                } /* XOR  B           */
  3884. OP(op,a9) { XOR(_C);                                                } /* XOR  C           */
  3885. OP(op,aa) { XOR(_D);                                                } /* XOR  D           */
  3886. OP(op,ab) { XOR(_E);                                                } /* XOR  E           */
  3887. OP(op,ac) { XOR(_H);                                                } /* XOR  H           */
  3888. OP(op,ad) { XOR(_L);                                                } /* XOR  L           */
  3889. OP(op,ae) { XOR(RM(_HL));                                            } /* XOR  (HL)          */
  3890. OP(op,af) { XOR(_A);                                                } /* XOR  A           */
  3891.  
  3892. OP(op,b0) { OR(_B);                                                 } /* OR   B           */
  3893. OP(op,b1) { OR(_C);                                                 } /* OR   C           */
  3894. OP(op,b2) { OR(_D);                                                 } /* OR   D           */
  3895. OP(op,b3) { OR(_E);                                                 } /* OR   E           */
  3896. OP(op,b4) { OR(_H);                                                 } /* OR   H           */
  3897. OP(op,b5) { OR(_L);                                                 } /* OR   L           */
  3898. OP(op,b6) { OR(RM(_HL));                                            } /* OR   (HL)          */
  3899. OP(op,b7) { OR(_A);                                                 } /* OR   A           */
  3900.  
  3901. OP(op,b8) { CP(_B);                                                 } /* CP   B           */
  3902. OP(op,b9) { CP(_C);                                                 } /* CP   C           */
  3903. OP(op,ba) { CP(_D);                                                 } /* CP   D           */
  3904. OP(op,bb) { CP(_E);                                                 } /* CP   E           */
  3905. OP(op,bc) { CP(_H);                                                 } /* CP   H           */
  3906. OP(op,bd) { CP(_L);                                                 } /* CP   L           */
  3907. OP(op,be) { CP(RM(_HL));                                            } /* CP   (HL)          */
  3908. OP(op,bf) { CP(_A);                                                 } /* CP   A           */
  3909.  
  3910. OP(op,c0) { RET( !(_F & ZF) );                                        } /* RET  NZ          */
  3911. OP(op,c1) { POP(BC);                                                } /* POP  BC          */
  3912. OP(op,c2) { JP_COND( !(_F & ZF) );                                    } /* JP   NZ,a          */
  3913. OP(op,c3) { JP;                                                     } /* JP   a           */
  3914. OP(op,c4) { CALL( !(_F & ZF) );                                     } /* CALL NZ,a          */
  3915. OP(op,c5) { PUSH( BC );                                             } /* PUSH BC          */
  3916. OP(op,c6) { ADD(ARG());                                             } /* ADD  A,n          */
  3917. OP(op,c7) { RST(0x00);                                                } /* RST  0           */
  3918.  
  3919. OP(op,c8) { RET( _F & ZF );                                         } /* RET  Z           */
  3920. OP(op,c9) { RET(1);                                                 } /* RET              */
  3921. OP(op,ca) { JP_COND( _F & ZF );                                     } /* JP   Z,a          */
  3922. OP(op,cb) { _R++; EXEC(cb,ROP());                                    } /* **** CB xx       */
  3923. OP(op,cc) { CALL( _F & ZF );                                        } /* CALL Z,a          */
  3924. OP(op,cd) { CALL(1);                                                } /* CALL a           */
  3925. OP(op,ce) { ADC(ARG());                                             } /* ADC  A,n          */
  3926. OP(op,cf) { RST(0x08);                                                } /* RST  1           */
  3927.  
  3928. OP(op,d0) { RET( !(_F & CF) );                                        } /* RET  NC          */
  3929. OP(op,d1) { POP(DE);                                                } /* POP  DE          */
  3930. OP(op,d2) { JP_COND( !(_F & CF) );                                    } /* JP   NC,a          */
  3931. OP(op,d3) { unsigned n = ARG() | (_A << 8); OUT( n, _A );            } /* OUT  (n),A       */
  3932. OP(op,d4) { CALL( !(_F & CF) );                                     } /* CALL NC,a          */
  3933. OP(op,d5) { PUSH( DE );                                             } /* PUSH DE          */
  3934. OP(op,d6) { SUB(ARG());                                             } /* SUB  n           */
  3935. OP(op,d7) { RST(0x10);                                                } /* RST  2           */
  3936.  
  3937. OP(op,d8) { RET( _F & CF );                                         } /* RET  C           */
  3938. OP(op,d9) { EXX;                                                    } /* EXX              */
  3939. OP(op,da) { JP_COND( _F & CF );                                     } /* JP   C,a          */
  3940. OP(op,db) { unsigned n = ARG() | (_A << 8); _A = IN( n );            } /* IN   A,(n)       */
  3941. OP(op,dc) { CALL( _F & CF );                                        } /* CALL C,a          */
  3942. OP(op,dd) { _R++; EXEC(dd,ROP());                                    } /* **** DD xx       */
  3943. OP(op,de) { SBC(ARG());                                             } /* SBC  A,n          */
  3944. OP(op,df) { RST(0x18);                                                } /* RST  3           */
  3945.  
  3946. OP(op,e0) { RET( !(_F & PF) );                                        } /* RET  PO          */
  3947. OP(op,e1) { POP(HL);                                                } /* POP  HL          */
  3948. OP(op,e2) { JP_COND( !(_F & PF) );                                    } /* JP   PO,a          */
  3949. OP(op,e3) { EXSP(HL);                                                } /* EX   HL,(SP)      */
  3950. OP(op,e4) { CALL( !(_F & PF) );                                     } /* CALL PO,a          */
  3951. OP(op,e5) { PUSH( HL );                                             } /* PUSH HL          */
  3952. OP(op,e6) { AND(ARG());                                             } /* AND  n           */
  3953. OP(op,e7) { RST(0x20);                                                } /* RST  4           */
  3954.  
  3955. OP(op,e8) { RET( _F & PF );                                         } /* RET  PE          */
  3956. OP(op,e9) { _PC = _HL; change_pc16(_PCD);                            } /* JP   (HL)          */
  3957. OP(op,ea) { JP_COND( _F & PF );                                     } /* JP   PE,a          */
  3958. OP(op,eb) { EX_DE_HL;                                                } /* EX   DE,HL       */
  3959. OP(op,ec) { CALL( _F & PF );                                        } /* CALL PE,a          */
  3960. OP(op,ed) { _R++; EXEC(ed,ROP());                                    } /* **** ED xx       */
  3961. OP(op,ee) { XOR(ARG());                                             } /* XOR  n           */
  3962. OP(op,ef) { RST(0x28);                                                } /* RST  5           */
  3963.  
  3964. OP(op,f0) { RET( !(_F & SF) );                                        } /* RET  P           */
  3965. OP(op,f1) { POP(AF);                                                } /* POP  AF          */
  3966. OP(op,f2) { JP_COND( !(_F & SF) );                                    } /* JP   P,a          */
  3967. OP(op,f3) { _IFF1 = _IFF2 = 0;                                        } /* DI               */
  3968. OP(op,f4) { CALL( !(_F & SF) );                                     } /* CALL P,a          */
  3969. OP(op,f5) { PUSH( AF );                                             } /* PUSH AF          */
  3970. OP(op,f6) { OR(ARG());                                                } /* OR   n           */
  3971. OP(op,f7) { RST(0x30);                                                } /* RST  6           */
  3972.  
  3973. OP(op,f8) { RET(_F & SF);                                            } /* RET  M           */
  3974. OP(op,f9) { _SP = _HL;                                                } /* LD   SP,HL       */
  3975. OP(op,fa) { JP_COND(_F & SF);                                        } /* JP   M,a          */
  3976. OP(op,fb) { EI;                                                     } /* EI               */
  3977. OP(op,fc) { CALL(_F & SF);                                            } /* CALL M,a          */
  3978. OP(op,fd) { _R++; EXEC(fd,ROP());                                    } /* **** FD xx       */
  3979. OP(op,fe) { CP(ARG());                                                } /* CP   n           */
  3980. OP(op,ff) { RST(0x38);                                                } /* RST  7           */
  3981.  
  3982.  
  3983. static void take_interrupt(void)
  3984. {
  3985.     if( _IFF1 )
  3986.     {
  3987.         int irq_vector;
  3988.  
  3989.         /* there isn't a valid previous program counter */
  3990.         _PPC = -1;
  3991.  
  3992.         /* Check if processor was halted */
  3993.         LEAVE_HALT;
  3994.  
  3995.         if( Z80.irq_max )           /* daisy chain mode */
  3996.         {
  3997.             if( Z80.request_irq >= 0 )
  3998.             {
  3999.                 /* Clear both interrupt flip flops */
  4000.                 _IFF1 = _IFF2 = 0;
  4001.                 irq_vector = Z80.irq[Z80.request_irq].interrupt_entry(Z80.irq[Z80.request_irq].irq_param);
  4002.                 LOG(("Z80#%d daisy chain irq_vector $%02x\n", cpu_getactivecpu(), irq_vector));
  4003.                 Z80.request_irq = -1;
  4004.             } else return;
  4005.         }
  4006.         else
  4007.         {
  4008.             /* Clear both interrupt flip flops */
  4009.             _IFF1 = _IFF2 = 0;
  4010.             /* call back the cpu interface to retrieve the vector */
  4011.             irq_vector = (*Z80.irq_callback)(0);
  4012.             LOG(("Z80#%d single int. irq_vector $%02x\n", cpu_getactivecpu(), irq_vector));
  4013.         }
  4014.  
  4015.         /* Interrupt mode 2. Call [Z80.I:databyte] */
  4016.         if( _IM == 2 )
  4017.         {
  4018.             irq_vector = (irq_vector & 0xff) | (_I << 8);
  4019.             PUSH( PC );
  4020.             RM16( irq_vector, &Z80.PC );
  4021.             LOG(("Z80#%d IM2 [$%04x] = $%04x\n",cpu_getactivecpu() , irq_vector, _PCD));
  4022.             Z80.extra_cycles += 19;
  4023.         }
  4024.         else
  4025.         /* Interrupt mode 1. RST 38h */
  4026.         if( _IM == 1 )
  4027.         {
  4028.             LOG(("Z80#%d IM1 $0038\n",cpu_getactivecpu() ));
  4029.             PUSH( PC );
  4030.             _PCD = 0x0038;
  4031.             Z80.extra_cycles += 11+2; /* RST $38 + 2 cycles */
  4032.         }
  4033.         else
  4034.         {
  4035.             /* Interrupt mode 0. We check for CALL and JP instructions, */
  4036.             /* if neither of these were found we assume a 1 byte opcode */
  4037.             /* was placed on the databus                                */
  4038.             LOG(("Z80#%d IM0 $%04x\n",cpu_getactivecpu() , irq_vector));
  4039.             switch (irq_vector & 0xff0000)
  4040.             {
  4041.                 case 0xcd0000:  /* call */
  4042.                     PUSH( PC );
  4043.                     Z80.extra_cycles += 5;  /* CALL $xxxx cycles (JP $xxxx follows)*/
  4044.                 case 0xc30000:  /* jump */
  4045.                     _PCD = irq_vector & 0xffff;
  4046.                     Z80.extra_cycles += 10 + 2; /* JP $xxxx + 2 cycles */
  4047.                     break;
  4048.                 default:        /* rst */
  4049.                     PUSH( PC );
  4050.                     _PCD = irq_vector & 0x0038;
  4051.                     Z80.extra_cycles += 11 + 2; /* RST $xx + 2 cycles */
  4052.                     break;
  4053.             }
  4054.         }
  4055.         change_pc(_PCD);
  4056.     }
  4057. }
  4058.  
  4059. /****************************************************************************
  4060.  * Reset registers to their initial values
  4061.  ****************************************************************************/
  4062. void z80_reset(void *param)
  4063. {
  4064.     Z80_DaisyChain *daisy_chain = (Z80_DaisyChain *)param;
  4065.     int i, p;
  4066. #if BIG_FLAGS_ARRAY
  4067.     if( !SZHVC_add || !SZHVC_sub )
  4068.     {
  4069.         int oldval, newval, val;
  4070.         UINT8 *padd, *padc, *psub, *psbc;
  4071.         /* allocate big flag arrays once */
  4072.         SZHVC_add = (UINT8 *)malloc(2*256*256);
  4073.         SZHVC_sub = (UINT8 *)malloc(2*256*256);
  4074.         if( !SZHVC_add || !SZHVC_sub )
  4075.         {
  4076.             LOG(("Z80: failed to allocate 2 * 128K flags arrays!!!\n"));
  4077.             raise(SIGABRT);
  4078.         }
  4079.         padd = &SZHVC_add[    0*256];
  4080.         padc = &SZHVC_add[256*256];
  4081.         psub = &SZHVC_sub[    0*256];
  4082.         psbc = &SZHVC_sub[256*256];
  4083.         for (oldval = 0; oldval < 256; oldval++)
  4084.         {
  4085.             for (newval = 0; newval < 256; newval++)
  4086.             {
  4087.                 /* add or adc w/o carry set */
  4088.                 val = newval - oldval;
  4089.                 *padd = (newval) ? ((newval & 0x80) ? SF : 0) : ZF;
  4090. #if Z80_EXACT
  4091.                 *padd |= (newval & (YF | XF));    /* undocumented flag bits 5+3 */
  4092. #endif
  4093.                 if( (newval & 0x0f) < (oldval & 0x0f) ) *padd |= HF;
  4094.                 if( newval < oldval ) *padd |= CF;
  4095.                 if( (val^oldval^0x80) & (val^newval) & 0x80 ) *padd |= VF;
  4096.                 padd++;
  4097.  
  4098.                 /* adc with carry set */
  4099.                 val = newval - oldval - 1;
  4100.                 *padc = (newval) ? ((newval & 0x80) ? SF : 0) : ZF;
  4101. #if Z80_EXACT
  4102.                 *padc |= (newval & (YF | XF));    /* undocumented flag bits 5+3 */
  4103. #endif
  4104.                 if( (newval & 0x0f) <= (oldval & 0x0f) ) *padc |= HF;
  4105.                 if( newval <= oldval ) *padc |= CF;
  4106.                 if( (val^oldval^0x80) & (val^newval) & 0x80 ) *padc |= VF;
  4107.                 padc++;
  4108.  
  4109.                 /* cp, sub or sbc w/o carry set */
  4110.                 val = oldval - newval;
  4111.                 *psub = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF);
  4112. #if Z80_EXACT
  4113.                 *psub |= (newval & (YF | XF));    /* undocumented flag bits 5+3 */
  4114. #endif
  4115.                 if( (newval & 0x0f) > (oldval & 0x0f) ) *psub |= HF;
  4116.                 if( newval > oldval ) *psub |= CF;
  4117.                 if( (val^oldval) & (oldval^newval) & 0x80 ) *psub |= VF;
  4118.                 psub++;
  4119.  
  4120.                 /* sbc with carry set */
  4121.                 val = oldval - newval - 1;
  4122.                 *psbc = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF);
  4123. #if Z80_EXACT
  4124.                 *psbc |= (newval & (YF | XF));    /* undocumented flag bits 5+3 */
  4125. #endif
  4126.                 if( (newval & 0x0f) >= (oldval & 0x0f) ) *psbc |= HF;
  4127.                 if( newval >= oldval ) *psbc |= CF;
  4128.                 if( (val^oldval) & (oldval^newval) & 0x80 ) *psbc |= VF;
  4129.                 psbc++;
  4130.             }
  4131.         }
  4132.     }
  4133. #endif
  4134.     for (i = 0; i < 256; i++)
  4135.     {
  4136.         p = 0;
  4137.         if( i&0x01 ) ++p;
  4138.         if( i&0x02 ) ++p;
  4139.         if( i&0x04 ) ++p;
  4140.         if( i&0x08 ) ++p;
  4141.         if( i&0x10 ) ++p;
  4142.         if( i&0x20 ) ++p;
  4143.         if( i&0x40 ) ++p;
  4144.         if( i&0x80 ) ++p;
  4145.         SZ[i] = i ? i & SF : ZF;
  4146. #if Z80_EXACT
  4147.         SZ[i] |= (i & (YF | XF));        /* undocumented flag bits 5+3 */
  4148. #endif
  4149.         SZ_BIT[i] = i ? i & SF : ZF | PF;
  4150. #if Z80_EXACT
  4151.         SZ_BIT[i] |= (i & (YF | XF));    /* undocumented flag bits 5+3 */
  4152. #endif
  4153.         SZP[i] = SZ[i] | ((p & 1) ? 0 : PF);
  4154.         SZHV_inc[i] = SZ[i];
  4155.         if( i == 0x80 ) SZHV_inc[i] |= VF;
  4156.         if( (i & 0x0f) == 0x00 ) SZHV_inc[i] |= HF;
  4157.         SZHV_dec[i] = SZ[i] | NF;
  4158.         if( i == 0x7f ) SZHV_dec[i] |= VF;
  4159.         if( (i & 0x0f) == 0x0f ) SZHV_dec[i] |= HF;
  4160.     }
  4161.  
  4162.     memset(&Z80, 0, sizeof(Z80));
  4163.     _IX = _IY = 0xffff; /* IX and IY are FFFF after a reset! */
  4164.     _F = ZF;            /* Zero flag is set */
  4165.     Z80.request_irq = -1;
  4166.     Z80.service_irq = -1;
  4167.     Z80.nmi_state = CLEAR_LINE;
  4168.     Z80.irq_state = CLEAR_LINE;
  4169.  
  4170.     if( daisy_chain )
  4171.     {
  4172.         while( daisy_chain->irq_param != -1 && Z80.irq_max < Z80_MAXDAISY )
  4173.         {
  4174.             /* set callbackhandler after reti */
  4175.             Z80.irq[Z80.irq_max] = *daisy_chain;
  4176.             /* device reset */
  4177.             if( Z80.irq[Z80.irq_max].reset )
  4178.                 Z80.irq[Z80.irq_max].reset(Z80.irq[Z80.irq_max].irq_param);
  4179.             Z80.irq_max++;
  4180.             daisy_chain++;
  4181.         }
  4182.     }
  4183.  
  4184.     change_pc(_PCD);
  4185. }
  4186.  
  4187. void z80_exit(void)
  4188. {
  4189. #if BIG_FLAGS_ARRAY
  4190.     if (SZHVC_add) free(SZHVC_add);
  4191.     SZHVC_add = NULL;
  4192.     if (SZHVC_sub) free(SZHVC_sub);
  4193.     SZHVC_sub = NULL;
  4194. #endif
  4195. }
  4196.  
  4197. /****************************************************************************
  4198.  * Execute 'cycles' T-states. Return number of T-states really executed
  4199.  ****************************************************************************/
  4200. int z80_execute(int cycles)
  4201. {
  4202.     z80_ICount = cycles - Z80.extra_cycles;
  4203.     Z80.extra_cycles = 0;
  4204.  
  4205.     do
  4206.     {
  4207.         _PPC = _PCD;
  4208.         CALL_MAME_DEBUG;
  4209.         _R++;
  4210.         EXEC_INLINE(op,ROP());
  4211.     } while( z80_ICount > 0 );
  4212.  
  4213.     z80_ICount -= Z80.extra_cycles;
  4214.     Z80.extra_cycles = 0;
  4215.  
  4216.     return cycles - z80_ICount;
  4217. }
  4218.  
  4219. /****************************************************************************
  4220.  * Burn 'cycles' T-states. Adjust R register for the lost time
  4221.  ****************************************************************************/
  4222. void z80_burn(int cycles)
  4223. {
  4224.     if( cycles > 0 )
  4225.     {
  4226.         /* NOP takes 4 cycles per instruction */
  4227.         int n = (cycles + 3) / 4;
  4228.         _R += n;
  4229.         z80_ICount -= 4 * n;
  4230.     }
  4231. }
  4232.  
  4233. /****************************************************************************
  4234.  * Get all registers in given buffer
  4235.  ****************************************************************************/
  4236. unsigned z80_get_context (void *dst)
  4237. {
  4238.     if( dst )
  4239.         *(Z80_Regs*)dst = Z80;
  4240.     return sizeof(Z80_Regs);
  4241. }
  4242.  
  4243. /****************************************************************************
  4244.  * Set all registers to given values
  4245.  ****************************************************************************/
  4246. void z80_set_context (void *src)
  4247. {
  4248.     if( src )
  4249.         Z80 = *(Z80_Regs*)src;
  4250.     change_pc(_PCD);
  4251. }
  4252.  
  4253. /****************************************************************************
  4254.  * Return program counter
  4255.  ****************************************************************************/
  4256. unsigned z80_get_pc (void)
  4257. {
  4258.     return _PCD;
  4259. }
  4260.  
  4261. /****************************************************************************
  4262.  * Set program counter
  4263.  ****************************************************************************/
  4264. void z80_set_pc (unsigned val)
  4265. {
  4266.     _PC = val;
  4267.     change_pc(_PCD);
  4268. }
  4269.  
  4270. /****************************************************************************
  4271.  * Return stack pointer
  4272.  ****************************************************************************/
  4273. unsigned z80_get_sp (void)
  4274. {
  4275.     return _SPD;
  4276. }
  4277.  
  4278. /****************************************************************************
  4279.  * Set stack pointer
  4280.  ****************************************************************************/
  4281. void z80_set_sp (unsigned val)
  4282. {
  4283.     _SP = val;
  4284. }
  4285.  
  4286. /****************************************************************************
  4287.  * Return a specific register
  4288.  ****************************************************************************/
  4289. unsigned z80_get_reg (int regnum)
  4290. {
  4291.     switch( regnum )
  4292.     {
  4293.         case Z80_PC: return Z80.PC.w.l;
  4294.         case Z80_SP: return Z80.SP.w.l;
  4295.         case Z80_AF: return Z80.AF.w.l;
  4296.         case Z80_BC: return Z80.BC.w.l;
  4297.         case Z80_DE: return Z80.DE.w.l;
  4298.         case Z80_HL: return Z80.HL.w.l;
  4299.         case Z80_IX: return Z80.IX.w.l;
  4300.         case Z80_IY: return Z80.IY.w.l;
  4301.         case Z80_R: return (Z80.R & 0x7f) | (Z80.R2 & 0x80);
  4302.         case Z80_I: return Z80.I;
  4303.         case Z80_AF2: return Z80.AF2.w.l;
  4304.         case Z80_BC2: return Z80.BC2.w.l;
  4305.         case Z80_DE2: return Z80.DE2.w.l;
  4306.         case Z80_HL2: return Z80.HL2.w.l;
  4307.         case Z80_IM: return Z80.IM;
  4308.         case Z80_IFF1: return Z80.IFF1;
  4309.         case Z80_IFF2: return Z80.IFF2;
  4310.         case Z80_HALT: return Z80.HALT;
  4311.         case Z80_NMI_STATE: return Z80.nmi_state;
  4312.         case Z80_IRQ_STATE: return Z80.irq_state;
  4313.         case Z80_DC0: return Z80.int_state[0];
  4314.         case Z80_DC1: return Z80.int_state[1];
  4315.         case Z80_DC2: return Z80.int_state[2];
  4316.         case Z80_DC3: return Z80.int_state[3];
  4317.         case REG_PREVIOUSPC: return Z80.PREPC.w.l;
  4318.         default:
  4319.             if( regnum <= REG_SP_CONTENTS )
  4320.             {
  4321.                 unsigned offset = _SPD + 2 * (REG_SP_CONTENTS - regnum);
  4322.                 if( offset < 0xffff )
  4323.                     return RM( offset ) | ( RM( offset + 1) << 8 );
  4324.             }
  4325.     }
  4326.     return 0;
  4327. }
  4328.  
  4329. /****************************************************************************
  4330.  * Set a specific register
  4331.  ****************************************************************************/
  4332. void z80_set_reg (int regnum, unsigned val)
  4333. {
  4334.     switch( regnum )
  4335.     {
  4336.         case Z80_PC: Z80.PC.w.l = val; break;
  4337.         case Z80_SP: Z80.SP.w.l = val; break;
  4338.         case Z80_AF: Z80.AF.w.l = val; break;
  4339.         case Z80_BC: Z80.BC.w.l = val; break;
  4340.         case Z80_DE: Z80.DE.w.l = val; break;
  4341.         case Z80_HL: Z80.HL.w.l = val; break;
  4342.         case Z80_IX: Z80.IX.w.l = val; break;
  4343.         case Z80_IY: Z80.IY.w.l = val; break;
  4344.         case Z80_R: Z80.R = val; Z80.R2 = val & 0x80; break;
  4345.         case Z80_I: Z80.I = val; break;
  4346.         case Z80_AF2: Z80.AF2.w.l = val; break;
  4347.         case Z80_BC2: Z80.BC2.w.l = val; break;
  4348.         case Z80_DE2: Z80.DE2.w.l = val; break;
  4349.         case Z80_HL2: Z80.HL2.w.l = val; break;
  4350.         case Z80_IM: Z80.IM = val; break;
  4351.         case Z80_IFF1: Z80.IFF1 = val; break;
  4352.         case Z80_IFF2: Z80.IFF2 = val; break;
  4353.         case Z80_HALT: Z80.HALT = val; break;
  4354.         case Z80_NMI_STATE: z80_set_nmi_line(val); break;
  4355.         case Z80_IRQ_STATE: z80_set_irq_line(0,val); break;
  4356.         case Z80_DC0: Z80.int_state[0] = val; break;
  4357.         case Z80_DC1: Z80.int_state[1] = val; break;
  4358.         case Z80_DC2: Z80.int_state[2] = val; break;
  4359.         case Z80_DC3: Z80.int_state[3] = val; break;
  4360.         default:
  4361.             if( regnum <= REG_SP_CONTENTS )
  4362.             {
  4363.                 unsigned offset = _SPD + 2 * (REG_SP_CONTENTS - regnum);
  4364.                 if( offset < 0xffff )
  4365.                 {
  4366.                     WM( offset, val & 0xff );
  4367.                     WM( offset+1, (val >> 8) & 0xff );
  4368.                 }
  4369.             }
  4370.     }
  4371. }
  4372.  
  4373. /****************************************************************************
  4374.  * Set NMI line state
  4375.  ****************************************************************************/
  4376. void z80_set_nmi_line(int state)
  4377. {
  4378.     if( Z80.nmi_state == state ) return;
  4379.  
  4380.     LOG(("Z80#%d set_nmi_line %d\n", cpu_getactivecpu(), state));
  4381.     Z80.nmi_state = state;
  4382.     if( state == CLEAR_LINE ) return;
  4383.  
  4384.     LOG(("Z80#%d take NMI\n", cpu_getactivecpu()));
  4385.     _PPC = -1;            /* there isn't a valid previous program counter */
  4386.     LEAVE_HALT;         /* Check if processor was halted */
  4387.  
  4388.     _IFF1 = 0;
  4389.     PUSH( PC );
  4390.     _PCD = 0x0066;
  4391.     Z80.extra_cycles += 11;
  4392. }
  4393.  
  4394. /****************************************************************************
  4395.  * Set IRQ line state
  4396.  ****************************************************************************/
  4397. void z80_set_irq_line(int irqline, int state)
  4398. {
  4399.     LOG(("Z80#%d set_irq_line %d\n",cpu_getactivecpu() , state));
  4400.     Z80.irq_state = state;
  4401.     if( state == CLEAR_LINE ) return;
  4402.  
  4403.     if( Z80.irq_max )
  4404.     {
  4405.         int daisychain, device, int_state;
  4406.         daisychain = (*Z80.irq_callback)(irqline);
  4407.         device = daisychain >> 8;
  4408.         int_state = daisychain & 0xff;
  4409.         LOG(("Z80#%d daisy chain $%04x -> device %d, state $%02x",cpu_getactivecpu(), daisychain, device, int_state));
  4410.  
  4411.         if( Z80.int_state[device] != int_state )
  4412.         {
  4413.             LOG((" change\n"));
  4414.             /* set new interrupt status */
  4415.             Z80.int_state[device] = int_state;
  4416.             /* check interrupt status */
  4417.             Z80.request_irq = Z80.service_irq = -1;
  4418.  
  4419.             /* search higher IRQ or IEO */
  4420.             for( device = 0 ; device < Z80.irq_max ; device ++ )
  4421.             {
  4422.                 /* IEO = disable ? */
  4423.                 if( Z80.int_state[device] & Z80_INT_IEO )
  4424.                 {
  4425.                     Z80.request_irq = -1;        /* if IEO is disable , masking lower IRQ */
  4426.                     Z80.service_irq = device;    /* set highest interrupt service device */
  4427.                 }
  4428.                 /* IRQ = request ? */
  4429.                 if( Z80.int_state[device] & Z80_INT_REQ )
  4430.                     Z80.request_irq = device;
  4431.             }
  4432.             LOG(("Z80#%d daisy chain service_irq $%02x, request_irq $%02x\n", cpu_getactivecpu(), Z80.service_irq, Z80.request_irq));
  4433.             if( Z80.request_irq < 0 ) return;
  4434.         }
  4435.         else
  4436.         {
  4437.             LOG((" no change\n"));
  4438.             return;
  4439.         }
  4440.     }
  4441.     take_interrupt();
  4442. }
  4443.  
  4444. /****************************************************************************
  4445.  * Set IRQ vector callback
  4446.  ****************************************************************************/
  4447. void z80_set_irq_callback(int (*callback)(int))
  4448. {
  4449.     LOG(("Z80#%d set_irq_callback $%08x\n",cpu_getactivecpu() , (int)callback));
  4450.     Z80.irq_callback = callback;
  4451. }
  4452.  
  4453. /****************************************************************************
  4454.  * Save CPU state
  4455.  ****************************************************************************/
  4456. void z80_state_save(void *file)
  4457. {
  4458.     int cpu = cpu_getactivecpu();
  4459.     state_save_UINT16(file, "z80", cpu, "AF", &Z80.AF.w.l, 1);
  4460.     state_save_UINT16(file, "z80", cpu, "BC", &Z80.BC.w.l, 1);
  4461.     state_save_UINT16(file, "z80", cpu, "DE", &Z80.DE.w.l, 1);
  4462.     state_save_UINT16(file, "z80", cpu, "HL", &Z80.HL.w.l, 1);
  4463.     state_save_UINT16(file, "z80", cpu, "IX", &Z80.IX.w.l, 1);
  4464.     state_save_UINT16(file, "z80", cpu, "IY", &Z80.IY.w.l, 1);
  4465.     state_save_UINT16(file, "z80", cpu, "PC", &Z80.PC.w.l, 1);
  4466.     state_save_UINT16(file, "z80", cpu, "SP", &Z80.SP.w.l, 1);
  4467.     state_save_UINT16(file, "z80", cpu, "AF2", &Z80.AF2.w.l, 1);
  4468.     state_save_UINT16(file, "z80", cpu, "BC2", &Z80.BC2.w.l, 1);
  4469.     state_save_UINT16(file, "z80", cpu, "DE2", &Z80.DE2.w.l, 1);
  4470.     state_save_UINT16(file, "z80", cpu, "HL2", &Z80.HL2.w.l, 1);
  4471.     state_save_UINT8(file, "z80", cpu, "R", &Z80.R, 1);
  4472.     state_save_UINT8(file, "z80", cpu, "R2", &Z80.R2, 1);
  4473.     state_save_UINT8(file, "z80", cpu, "IFF1", &Z80.IFF1, 1);
  4474.     state_save_UINT8(file, "z80", cpu, "IFF2", &Z80.IFF2, 1);
  4475.     state_save_UINT8(file, "z80", cpu, "HALT", &Z80.HALT, 1);
  4476.     state_save_UINT8(file, "z80", cpu, "IM", &Z80.IM, 1);
  4477.     state_save_UINT8(file, "z80", cpu, "I", &Z80.I, 1);
  4478.     state_save_UINT8(file, "z80", cpu, "irq_max", &Z80.irq_max, 1);
  4479.     state_save_INT8(file, "z80", cpu, "request_irq", &Z80.request_irq, 1);
  4480.     state_save_INT8(file, "z80", cpu, "service_irq", &Z80.service_irq, 1);
  4481.     state_save_UINT8(file, "z80", cpu, "int_state", Z80.int_state, 4);
  4482.     state_save_UINT8(file, "z80", cpu, "nmi_state", &Z80.nmi_state, 1);
  4483.     state_save_UINT8(file, "z80", cpu, "irq_state", &Z80.irq_state, 1);
  4484.     /* daisy chain needs to be saved by z80ctc.c somehow */
  4485. }
  4486.  
  4487. /****************************************************************************
  4488.  * Load CPU state
  4489.  ****************************************************************************/
  4490. void z80_state_load(void *file)
  4491. {
  4492.     int cpu = cpu_getactivecpu();
  4493.     state_load_UINT16(file, "z80", cpu, "AF", &Z80.AF.w.l, 1);
  4494.     state_load_UINT16(file, "z80", cpu, "BC", &Z80.BC.w.l, 1);
  4495.     state_load_UINT16(file, "z80", cpu, "DE", &Z80.DE.w.l, 1);
  4496.     state_load_UINT16(file, "z80", cpu, "HL", &Z80.HL.w.l, 1);
  4497.     state_load_UINT16(file, "z80", cpu, "IX", &Z80.IX.w.l, 1);
  4498.     state_load_UINT16(file, "z80", cpu, "IY", &Z80.IY.w.l, 1);
  4499.     state_load_UINT16(file, "z80", cpu, "PC", &Z80.PC.w.l, 1);
  4500.     state_load_UINT16(file, "z80", cpu, "SP", &Z80.SP.w.l, 1);
  4501.     state_load_UINT16(file, "z80", cpu, "AF2", &Z80.AF2.w.l, 1);
  4502.     state_load_UINT16(file, "z80", cpu, "BC2", &Z80.BC2.w.l, 1);
  4503.     state_load_UINT16(file, "z80", cpu, "DE2", &Z80.DE2.w.l, 1);
  4504.     state_load_UINT16(file, "z80", cpu, "HL2", &Z80.HL2.w.l, 1);
  4505.     state_load_UINT8(file, "z80", cpu, "R", &Z80.R, 1);
  4506.     state_load_UINT8(file, "z80", cpu, "R2", &Z80.R2, 1);
  4507.     state_load_UINT8(file, "z80", cpu, "IFF1", &Z80.IFF1, 1);
  4508.     state_load_UINT8(file, "z80", cpu, "IFF2", &Z80.IFF2, 1);
  4509.     state_load_UINT8(file, "z80", cpu, "HALT", &Z80.HALT, 1);
  4510.     state_load_UINT8(file, "z80", cpu, "IM", &Z80.IM, 1);
  4511.     state_load_UINT8(file, "z80", cpu, "I", &Z80.I, 1);
  4512.     state_load_UINT8(file, "z80", cpu, "irq_max", &Z80.irq_max, 1);
  4513.     state_load_INT8(file, "z80", cpu, "request_irq", &Z80.request_irq, 1);
  4514.     state_load_INT8(file, "z80", cpu, "service_irq", &Z80.service_irq, 1);
  4515.     state_load_UINT8(file, "z80", cpu, "int_state", Z80.int_state, 4);
  4516.     state_load_UINT8(file, "z80", cpu, "nmi_state", &Z80.nmi_state, 1);
  4517.     state_load_UINT8(file, "z80", cpu, "irq_state", &Z80.irq_state, 1);
  4518.     /* daisy chain needs to be restored by z80ctc.c somehow */
  4519. }
  4520.  
  4521. /****************************************************************************
  4522.  * Return a formatted string for a register
  4523.  ****************************************************************************/
  4524. const char *z80_info(void *context, int regnum)
  4525. {
  4526.     static char buffer[32][47+1];
  4527.     static int which = 0;
  4528.     Z80_Regs *r = context;
  4529.  
  4530.     which = ++which % 32;
  4531.     buffer[which][0] = '\0';
  4532.     if( !context )
  4533.         r = &Z80;
  4534.  
  4535.     switch( regnum )
  4536.     {
  4537.         case CPU_INFO_REG+Z80_PC: sprintf(buffer[which], "PC:%04X", r->PC.w.l); break;
  4538.         case CPU_INFO_REG+Z80_SP: sprintf(buffer[which], "SP:%04X", r->SP.w.l); break;
  4539.         case CPU_INFO_REG+Z80_AF: sprintf(buffer[which], "AF:%04X", r->AF.w.l); break;
  4540.         case CPU_INFO_REG+Z80_BC: sprintf(buffer[which], "BC:%04X", r->BC.w.l); break;
  4541.         case CPU_INFO_REG+Z80_DE: sprintf(buffer[which], "DE:%04X", r->DE.w.l); break;
  4542.         case CPU_INFO_REG+Z80_HL: sprintf(buffer[which], "HL:%04X", r->HL.w.l); break;
  4543.         case CPU_INFO_REG+Z80_IX: sprintf(buffer[which], "IX:%04X", r->IX.w.l); break;
  4544.         case CPU_INFO_REG+Z80_IY: sprintf(buffer[which], "IY:%04X", r->IY.w.l); break;
  4545.         case CPU_INFO_REG+Z80_R: sprintf(buffer[which], "R:%02X", (r->R & 0x7f) | (r->R2 & 0x80)); break;
  4546.         case CPU_INFO_REG+Z80_I: sprintf(buffer[which], "I:%02X", r->I); break;
  4547.         case CPU_INFO_REG+Z80_AF2: sprintf(buffer[which], "AF'%04X", r->AF2.w.l); break;
  4548.         case CPU_INFO_REG+Z80_BC2: sprintf(buffer[which], "BC'%04X", r->BC2.w.l); break;
  4549.         case CPU_INFO_REG+Z80_DE2: sprintf(buffer[which], "DE'%04X", r->DE2.w.l); break;
  4550.         case CPU_INFO_REG+Z80_HL2: sprintf(buffer[which], "HL'%04X", r->HL2.w.l); break;
  4551.         case CPU_INFO_REG+Z80_IM: sprintf(buffer[which], "IM:%X", r->IM); break;
  4552.         case CPU_INFO_REG+Z80_IFF1: sprintf(buffer[which], "IFF1:%X", r->IFF1); break;
  4553.         case CPU_INFO_REG+Z80_IFF2: sprintf(buffer[which], "IFF2:%X", r->IFF2); break;
  4554.         case CPU_INFO_REG+Z80_HALT: sprintf(buffer[which], "HALT:%X", r->HALT); break;
  4555.         case CPU_INFO_REG+Z80_NMI_STATE: sprintf(buffer[which], "NMI:%X", r->nmi_state); break;
  4556.         case CPU_INFO_REG+Z80_IRQ_STATE: sprintf(buffer[which], "IRQ:%X", r->irq_state); break;
  4557.         case CPU_INFO_REG+Z80_DC0: if(Z80.irq_max >= 1) sprintf(buffer[which], "DC0:%X", r->int_state[0]); break;
  4558.         case CPU_INFO_REG+Z80_DC1: if(Z80.irq_max >= 2) sprintf(buffer[which], "DC1:%X", r->int_state[1]); break;
  4559.         case CPU_INFO_REG+Z80_DC2: if(Z80.irq_max >= 3) sprintf(buffer[which], "DC2:%X", r->int_state[2]); break;
  4560.         case CPU_INFO_REG+Z80_DC3: if(Z80.irq_max >= 4) sprintf(buffer[which], "DC3:%X", r->int_state[3]); break;
  4561.         case CPU_INFO_FLAGS:
  4562.             sprintf(buffer[which], "%c%c%c%c%c%c%c%c",
  4563.                 r->AF.b.l & 0x80 ? 'S':'.',
  4564.                 r->AF.b.l & 0x40 ? 'Z':'.',
  4565.                 r->AF.b.l & 0x20 ? '5':'.',
  4566.                 r->AF.b.l & 0x10 ? 'H':'.',
  4567.                 r->AF.b.l & 0x08 ? '3':'.',
  4568.                 r->AF.b.l & 0x04 ? 'P':'.',
  4569.                 r->AF.b.l & 0x02 ? 'N':'.',
  4570.                 r->AF.b.l & 0x01 ? 'C':'.');
  4571.             break;
  4572.         case CPU_INFO_NAME: return "Z80";
  4573.         case CPU_INFO_FAMILY: return "Zilog Z80";
  4574.         case CPU_INFO_VERSION: return "2.8";
  4575.         case CPU_INFO_FILE: return __FILE__;
  4576.         case CPU_INFO_CREDITS: return "Copyright (C) 1998,1999 Juergen Buchmueller, all rights reserved.";
  4577.         case CPU_INFO_REG_LAYOUT: return (const char *)z80_reg_layout;
  4578.         case CPU_INFO_WIN_LAYOUT: return (const char *)z80_win_layout;
  4579.     }
  4580.     return buffer[which];
  4581. }
  4582.  
  4583. unsigned z80_dasm( char *buffer, unsigned pc )
  4584. {
  4585. #ifdef MAME_DEBUG
  4586.     return DasmZ80( buffer, pc );
  4587. #else
  4588.     sprintf( buffer, "$%02X", cpu_readop(pc) );
  4589.     return 1;
  4590. #endif
  4591. }
  4592.  
  4593.